如果是单线程,聊天的发送和接收必须有顺序,为了更符合常规,采用多线程实现发送和接收数据,本文用子线程进行接收数据,主线程发送数据,这样就可以了
//接收线程 package com.dream.tcp03; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.Socket; public class ReceiveThread extends Thread { private Socket socket; public ReceiveThread(Socket socket) { super(); this.socket = socket; } @Override public void run() { try { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK")); while(true){ String readLine = bufferedReader.readLine(); System.out.println(readLine); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //服务器 package com.dream.tcp03; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Servicer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("服务端启动----"); Socket socket = serverSocket.accept(); System.out.println("客人来啦----"); Scanner sc=new Scanner(System.in); PrintStream ps = new PrintStream(socket.getOutputStream()); // 子线程接收数据 ReceiveThread receiveThread = new ReceiveThread(socket); receiveThread.start(); //主线程发送数据 while(true){ String str=sc.next(); ps.println("服务端:"+str); } } } //客户端 package com.dream.tcp03; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Socket socket = new Socket("127.0.0.1", 8080); Scanner sc=new Scanner(System.in); PrintStream ps = new PrintStream(socket.getOutputStream()); // 子线程接收数据 ReceiveThread receiveThread = new ReceiveThread(socket); receiveThread.start(); // 主线程发送数据 while(true){ String str=sc.next(); ps.println("客户端:"+str); } } }