用java给出实现基于TCP socket的图形化点对点聊天应用的代码给出测试数据并输出结果
时间: 2024-02-18 11:03:50 浏览: 23
以下是基于TCP socket的图形化点对点聊天应用的Java代码:
Client.java
```java
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Client extends JFrame {
private JTextArea chatArea;
private JTextField inputField;
private JButton sendButton;
private Socket socket;
private BufferedReader reader;
private BufferedWriter writer;
public Client() {
super("Chat Client");
initUI();
initNetwork();
}
private void initUI() {
chatArea = new JTextArea();
add(new JScrollPane(chatArea), "Center");
JPanel panel = new JPanel();
inputField = new JTextField(20);
panel.add(inputField);
sendButton = new JButton("Send");
sendButton.addActionListener(e -> sendMessage());
panel.add(sendButton);
add(panel, "South");
setSize(300, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void initNetwork() {
try {
socket = new Socket("localhost", 8888);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
new Thread(() -> {
try {
while (true) {
String message = reader.readLine();
chatArea.append(message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendMessage() {
String message = inputField.getText().trim();
if (!message.isEmpty()) {
try {
writer.write(message + "\n");
writer.flush();
inputField.setText("");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client();
}
}
```
Server.java
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
private List<Socket> sockets = new ArrayList<>();
public Server() {
try {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server started");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New client connected: " + socket.getRemoteSocketAddress());
sockets.add(socket);
new Thread(() -> handleClient(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void handleClient(Socket socket) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String message = reader.readLine();
if (message == null) {
break;
}
System.out.println("Received message from " + socket.getRemoteSocketAddress() + ": " + message);
broadcast(message);
}
System.out.println("Client disconnected: " + socket.getRemoteSocketAddress());
sockets.remove(socket);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void broadcast(String message) {
for (Socket socket : sockets) {
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write(message + "\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server();
}
}
```
测试数据:启动一个Server实例和两个Client实例,分别在两个窗口中输入和发送消息。
结果:在Server控制台中可以看到收到的消息,同时所有的Client窗口中都会显示相同的消息。