如果是单线程,聊天的发送和接收必须有顺序,为了更符合常规,采用多线程实现发送和接收数据,本文用子线程进行接收数据,主线程发送数据,这样就可以了
//接收线程
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);
}
}
}