TCP多线程编程
一个ServerSocket能够和多个客户端同时创建链接,因此一个Server能够同时与多个客户端创建好的Socket进行双向通讯。
所以服务器端,当咱们打开一个Socket之后,一般使用一个无限for循环,在这个for循环内部,每次调用accept方法,返回一个与远程客户新建的Socket链接,紧接着启动一个新的线程,来处理这个链接。java
ServerSocket ss = new ServerSocket(port); for( ; ; ){ Socket sock = ss.accept(); Thread t = new Thread(){ public void run(){ process(sock); } } t.start(); }
TCPServer.java编程
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; public class TCPServer { public static void main(String[] args) throws Exception{ ServerSocket ss = new ServerSocket(9090); System.out.println("TCP Server ready"); for(;;){ Socket sock = ss.accept(); System.out.println("Accept from "+sock.getRemoteSocketAddress()); TimeHandle handle = new TimeHandle(sock); handle.start(); } } } class TimeHandle extends Thread{ Socket sock; TimeHandle(Socket sock){ this.sock = sock; } public void run(){ try(BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8))){ try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),StandardCharsets.UTF_8))){ for(;;){ String cmd = reader.readLine(); if("q".equals(cmd)){ writer.write("bye!\n"); writer.flush(); break; }else if("time".equals(cmd)){ writer.write(LocalDateTime.now().toString()+"\n"); writer.flush(); }else{ writer.write("Sorry?\n"); writer.flush(); } } } }catch (IOException e){ e.printStackTrace(); }finally { try{ this.sock.close(); }catch (IOException e){ e.printStackTrace(); } } } }
运行2次client,服务器端的运行结果
TCPClient.java服务器
import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.nio.charset.StandardCharsets; public class TCPClient { public static void main(String[] args) throws Exception{ InetAddress addr = InetAddress.getByName("localhost"); System.out.println(addr); try(Socket sock = new Socket(addr,9090)){ try(BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8))){ try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),StandardCharsets.UTF_8))){ writer.write("time\n"); writer.flush(); String resp = reader.readLine(); System.out.println("Response:"+resp); Thread.sleep(1000); writer.write("q\n"); writer.flush(); resp=reader.readLine(); System.out.println("Response:"+resp); } } } } }
TCP多线程编程模型:多线程