JAVA BIO 服務器與客戶端實現示例

代碼只兼容JAVA 7及以上版本。


服務器端代碼:

package com.stevex.app.bio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.net.ServerSocketFactory;

public class XiaoNa {
	public static void main(String[] args){
		XiaoNa xiaona = new XiaoNa();
		
		ServerSocket serverSocket = null;
		Socket socket = null;

		try {
			//可以設置客戶連接請求隊列的長度,比如5,隊列長度超過5後拒絕連接請求
			//serverSocket = ServerSocketFactory.getDefault().createServerSocket(8383, 5);		
			serverSocket = ServerSocketFactory.getDefault().createServerSocket(8383);	
			
			while(true){
				try{
					//監聽直到接受連接後返回一個新Socket對象
					socket = serverSocket.accept();//阻塞
					//new一個線程處理連接請求
					new Thread(xiaona.new Worker(socket)).start();;
				}
				catch (Throwable e) {	//防止發生異常搞死服務器			
					e.printStackTrace();
				}				
			}			
		} catch (IOException e) {				
			e.printStackTrace();
		}
		finally{				
			try {				
				if(socket != null){
					socket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}	
		}
	}
	
	private static String getAnswer(String question){
		String answer = null;
		
		switch(question){
		case "who":
			answer = "我是小娜";
			break;
		case "what":
			answer = "我是來幫你解悶的";
			break;
		case "where":
			answer = "我來自外太空";
			break;
		default:
				answer = "請輸入 who, 或者what, 或者where";
		}
		
		return answer;
	}
	
	private class Worker implements Runnable{
		private Socket socket;
		
		public Worker(Socket socket){
			this.socket = socket;
		}
		
		@Override
		public void run() {
			BufferedReader reader = null;
			PrintWriter writer = null;
			
			try {
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
				writer = new PrintWriter(socket.getOutputStream());
				
				String question = reader.readLine();//沒有內容會阻塞
				
				while(!question.equals("OVER")){
					String answer = getAnswer(question);
					writer.println(answer);
					question = reader.readLine();
				}
				
				writer.println("OVER");//OVER作爲操作完成暗號
				writer.flush();
				
				if(writer != null){
					writer.close();
				}
									
				if(reader != null){
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}


客戶端代碼:

package com.stevex.app.bio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
	public static void main(String[] args) {
		Client c = new Client();
		
		//種20個線程發起Socket客戶端連接請求
		for(int i=0; i<20; i++){
			new Thread(c.new Worker()).start();
		}		
	}
	
	private class Worker implements Runnable{

		@Override
		public void run() {
			Socket socket = null;
			BufferedReader reader = null;
			PrintWriter writer = null;

			try {
				//創建一個Socket並連接到指定的目標服務器
				socket = new Socket("localhost", 8383);

				reader = new BufferedReader(new InputStreamReader(
						socket.getInputStream()));
				writer = new PrintWriter(socket.getOutputStream());

				writer.println("who");
				writer.println("what");
				writer.println("where");
				writer.println("OVER");//OVER作爲操作完成暗號
				writer.flush();

				String answer = reader.readLine();	//沒有內容會阻塞		
				while(! answer.equals("OVER")){				
					System.out.println(Thread.currentThread().getId() + "---Message from server:" + answer);
					answer = reader.readLine();
				}

			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (writer != null) {
						writer.close();
					}

					if (reader != null) {
						reader.close();
					}

					if (socket != null) {
						socket.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章