- 服务端、接收端
- 接收消息线程、发送消息线程
- 服务端、接收端分别启动自己的接收消息线程和发送消息线程实现全双工通信
- 注意:直接使用的死循环,没有考虑退出问题


独立的接收消息线程
public class ReceiveMessageThread extends Thread{
private Socket socket;
private String name;
public ReceiveMessageThread(Socket socket, String name) {
this.socket = socket;
this.name = name;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String str =bufferedReader.readLine();
if (str!=null){
System.out.println(str);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
独立的发送消息线程
public class SendMessageThread extends Thread{
private Socket socket;
private String name;
public SendMessageThread(Socket socket,String name) {
this.socket = socket;
this.name = name;
}
@Override
public void run() {
PrintWriter pWriter = null;
Scanner scanner = null;
try {
pWriter = new PrintWriter(socket.getOutputStream());
scanner = new Scanner(System.in);
while (true) {
String s = scanner.nextLine();
pWriter.write(name+": " + s + "\n");
pWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
scanner.close();
pWriter.close();
}
}
}
客户端类
public class MyClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost",8888);
System.out.println("连接成功");
Thread t1 = new ReceiveMessageThread(socket,"service");
Thread t2 = new SendMessageThread(socket,"service");
t1.start();
t2.start();
}
}
服务端类
public class MyServer {
public static void main(String[] args) throws IOException {
System.out.println("等待连接...");
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
System.out.println("连接成功...");
Thread t1 = new ReceiveMessageThread(socket,"client");
Thread t2 = new SendMessageThread(socket,"client");
t1.start();
t2.start();
}
}
本文通过Java的Socket编程实现全双工聊天,服务端和接收端各自拥有独立的接收和发送消息线程,利用死循环进行持续通信,但未涉及退出机制。

1719

被折叠的 条评论
为什么被折叠?



