前几篇文章都有一个明显的问题就是只能按照先后顺序进行信息的发送,先客户端发送 消息,然后服务端才能发送信息;现在需要将接收信息和发送信息两个功能放到两个独立线程中,让他们并发执行;
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* 发送消息的线程
*/
class Send extends Thread{
//与客户端对应的socket对象
private Socket socket;
public Send(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
this.sendMsg();
}
/**
* 发送消息
*/
private void sendMsg(){
try(Scanner scanner = new Scanner(System.in);
//创建向对方发送消息的输出流
PrintWriter pw = new PrintWriter(socket.getOutputStream());
){
while (true){
String msg = scanner.nextLine();
pw.println(msg);
pw.flush();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 接收消息的线程
*/
class Receive extends Thread{
//与客户端对应的Socket对象
private Socket socket;
public Receive(Socket socket){
this.socket = socket;
}
@Override
public void run() {
this.receiveMsg();
}
/**
* 用于接收对方消息的方法
*/
private void receiveMsg(){
try(BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
while (true){
String msg = br.readLine();
System.out.println("他说:"+msg);
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 接收消息的线程
*/
public class ChatSocketServer {
public static void main(String[] args) {
try(ServerSocket serverSocket = new ServerSocket(8888)){
System.out.println("服务端启动,等待连接.....");
Socket socket = serverSocket.accept();
System.out.println("连接成功");
//将与客户端对应的Socket对象传递给发送消息的线程,并启动该线程
new Send(socket).start();
new Receive(socket).start();
}catch (Exception e) {
e.printStackTrace();
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/***
* 用于发送消息
*/
class ClientSend extends Thread{
//与服务端对应的Socket对象
private Socket socket;
public ClientSend(Socket socket){
this.socket = socket;
}
@Override
public void run() {
this.sendMsg();
}
private void sendMsg(){
try(Scanner scanner = new Scanner(System.in);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
){
while (true){
String msg = scanner.nextLine();
pw.println(msg);
pw.flush();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 用于接收消息
*/
class ClientReceive extends Thread{
//与服务端对应的Socket对象
private Socket socket;
public ClientReceive(Socket socket){
this.socket = socket;
}
@Override
public void run() {
this.receiveMsg();
}
/**
* 接收消息
*/
private void receiveMsg() {
//创建用于接收对方消息的流对象
try(BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
){
while (true){
String msg = br.readLine();
System.out.println("他说:"+msg);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
public class ChartSocketClient {
public static void main(String[] args) {
try{
Socket socket = new Socket("127.0.0.1",8888);
System.out.println("连接成功");
new ClientSend(socket).start();
new ClientReceive(socket).start();
}catch (Exception e){
e.printStackTrace();
}
}
}
运行结果如图:
客户端如图: