利用線程池實現多個客戶端和服務器端交流


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class AutoReplyTcpClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket client=new Socket("127.0.0.1",6667);
		System.out.println("連接服務器127.0.0.1成功");
		DataOutputStream dos = new DataOutputStream(client.getOutputStream());
		DataInputStream dis = new DataInputStream(client.getInputStream());
		Scanner sc=new Scanner(System.in);
		String str="";
		while(!"quit".equals(str=sc.nextLine())){
			dos.writeUTF(str);//將控制檯內容寫入服務器中
			String response=dis.readUTF();//讀取服務器內容
			System.out.println("服務器:"+response);
		}
		
	}
}

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolAutoReplyTcpServer {
	static void charWithClient(Socket client) throws IOException{
		DataOutputStream dos = new DataOutputStream(client.getOutputStream());
		DataInputStream dis = new DataInputStream(client.getInputStream());
		while (true) {
			//加try是爲了防止,客戶端斷開連接出現異常
			try {
				// 用這個流去封裝輸入流
				String str = dis.readUTF();// 直接讀取字符串
				System.out.println("收到來自客戶端[" + client.getPort() + "]的消息:" + str);
				// 再把數據寫回去
				dos.writeUTF("收到了(" + str + ")");
			} catch (Exception e) {
				System.out.println("與客戶端["+client.getPort()+"]斷開連接");
				break;
			}
		}
	}
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(6667);
		System.out.println("服務器端在6666端口啓動成功,等待客戶端連接...");	
		//創建線程池
		ExecutorService pool=Executors.newFixedThreadPool(3);//同時運行3個客戶端
		while (true) {
			// 啓動監聽
			Socket client = ss.accept();
			System.out.println("客戶端[" + client.getPort() + "]連接成功");
			pool.submit(new Runnable() {
				@Override
				public void run() {
					try {
						charWithClient(client);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}					
				}
			});
			
		}
	
	}
}

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