java基于TCP的C/S通信,客户端和服务器端一对一对话,服务器端的UI窗口设置监听按钮,以及将发送和收到的消息显示在两个框内
时间: 2024-05-12 21:20:39 浏览: 45
客户端代码:
```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
// 创建Socket对象,指定服务器IP和端口号
Socket socket = new Socket("localhost", 8888);
// 获取输出流,向服务器发送消息
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 获取输入流,读取服务器返回的消息
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 创建一个Scanner对象,用于读取控制台输入
Scanner scanner = new Scanner(System.in);
// 不断读取控制台输入,将其发送到服务器
while (true) {
System.out.print("请输入要发送的消息:");
String msg = scanner.nextLine();
out.println(msg);
if ("exit".equals(msg)) {
break;
}
// 读取服务器返回的消息并打印
String resp = in.readLine();
System.out.println("服务器返回的消息:" + resp);
if ("exit".equals(resp)) {
break;
}
}
// 关闭资源
scanner.close();
in.close();
out.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
服务器端代码:
```
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Server extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea msgArea;
private JButton listenBtn;
private ServerSocket serverSocket;
public Server() {
// 设置窗口标题
setTitle("服务器端");
// 设置窗口大小
setSize(500, 400);
// 设置窗口关闭按钮的默认操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建面板
JPanel panel = new JPanel();
// 创建文本域并设置大小和位置
msgArea = new JTextArea();
msgArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(msgArea);
scrollPane.setBounds(10, 10, 460, 280);
panel.add(scrollPane);
// 创建按钮并设置大小和位置
listenBtn = new JButton("开启监听");
listenBtn.setBounds(10, 300, 120, 30);
panel.add(listenBtn);
// 将面板添加到窗口中
add(panel);
// 添加按钮监听器
listenBtn.addActionListener(e -> {
if (serverSocket == null) {
// 开启监听
try {
serverSocket = new ServerSocket(8888);
msgArea.append("服务器已开启监听...\n");
// 创建一个线程来监听客户端的连接请求
new Thread(() -> {
try {
while (true) {
// 接受客户端的连接请求
Socket socket = serverSocket.accept();
msgArea.append("已连接客户端:" + socket.getInetAddress().getHostAddress() + "\n");
// 创建一个线程来处理客户端的消息
new Thread(() -> {
try {
// 获取输入流,读取客户端发送的消息
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 获取输出流,向客户端发送消息
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while (true) {
// 读取客户端发送的消息并打印
String msg = in.readLine();
msgArea.append("客户端发送的消息:" + msg + "\n");
if ("exit".equals(msg)) {
out.println("exit");
break;
}
// 向客户端发送消息并打印
out.println("已收到消息:" + msg);
msgArea.append("已向客户端发送消息:" + "已收到消息:" + msg + "\n");
}
// 关闭资源
in.close();
out.close();
socket.close();
msgArea.append("已断开客户端:" + socket.getInetAddress().getHostAddress() + "\n");
} catch (IOException e1) {
e1.printStackTrace();
}
}).start();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}).start();
} catch (IOException e1) {
e1.printStackTrace();
}
} else {
// 关闭监听
try {
serverSocket.close();
serverSocket = null;
msgArea.append("服务器已关闭监听...\n");
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
// 显示窗口
setVisible(true);
}
public static void main(String[] args) {
new Server();
}
}
```
客户端可以在控制台输入消息,服务器端可以在UI窗口上显示收到的消息,并可以通过监听按钮开启或关闭监听。