客户端的代码:
[Java]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package tcp.http;import java.io.*;import java.net.*;import java.util.Scanner;public class Client{public static void main(String[] args) throws IOException{Scanner scanner=new Scanner(System.in);//1.创建SocketSocket tcpClientSocket=new Socket();//2.TCP要发送消息,必须先建立连接byte[] IPv4={127,0,0,1}; //连接到本机InetAddress serverAddress=InetAddress.getByAddress(IPv4);SocketAddress serverSocketAddress=new InetSocketAddress(serverAddress,7777);tcpClientSocket.connect(serverSocketAddress);//连接上了,(连接过程代码比较长,但是没有什么复杂的,只需要查文档根据函数的构造过程,一步步来写就好了)while(true){ //写个死循环来聊天String request=scanner.nextLine();//通过字节流写入请求OutputStream os=tcpClientSocket.getOutputStream();//通过打印流打印和写入PrintStream out=new PrintStream(os,true,"UTF-8");out.println(request);//通过字节流读取响应InputStream is=tcpClientSocket.getInputStream();BufferedReader reader=new BufferedReader(new InputStreamReader(is,"UTF-8")); //通过readLine()来保证每次都能把一句完整的话读完(\r\n是标志);String response=reader.readLine();System.out.println(" "+response);}//tcpClientSocket.close();}} |
服务器端的代码:
[Java]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | package tcp.threads;import java.io.*;import java.net.*;import java.util.Scanner;import java.util.concurrent.*;public class Server{private static class TalkRunnable implements Runnable{ //一个个的工作线程private Socket clientSocket;TalkRunnable(Socket socket){this.clientSocket=socket;}@Overridepublic void run(){try{InetAddress clientAddress=clientSocket.getInetAddress();int clientPort=clientSocket.getPort();System.out.printf("ID为 %s:%d 的好友上线了%n",clientAddress.getHostAddress(),clientPort);//获取字节流InputStream is=null;is=clientSocket.getInputStream();//字节流转换为字符流InputStreamReader isReader=null;isReader=new InputStreamReader(is,"UTF-8");//获取输出字节流OutputStream os=clientSocket.getOutputStream();//获取打印流PrintStream out=new PrintStream(os,true,"UTF-8");//获取缓冲字符流BufferedReader reader=new BufferedReader(isReader);while(true){ //死循环聊天String line=reader.readLine();System.out.println(" 好友说:"+line);Scanner scanner=new Scanner(System.in);String response=scanner.nextLine();out.println(response);}}catch(IOException e){e.printStackTrace();}}}public static void main(String[] args) throws IOException{//监听连接ServerSocket tcpServerSocket=new ServerSocket(7777);//定义阻塞队列BlockingQueue<Runnable> queue=new LinkedBlockingQueue<>();//创建线程池ExecutorService pool=new ThreadPoolExecutor(100,100,0,TimeUnit.MILLISECONDS,queue);while(true){//TCP 要发送消息必须先建立连接Socket clientSocket=tcpServerSocket.accept();pool.execute(new TalkRunnable(clientSocket));//有一个客户端连接到服务器,就起一个线程来专门处理这个对话}}} |
运行结果:

为什么要使用多线程?
因为单线程会发生阻塞,聊天就进行不下去了。。。
因为单线程会发生阻塞,聊天就进行不下去了。。。