JAVA,用TCP和GUI写一对一聊天程序
时间: 2024-02-09 17:08:06 浏览: 28
好的,我可以为您提供一些指导。
首先,您需要使用Java的Socket类来实现TCP连接。您可以创建一个客户端和一个服务器端程序,以便两个用户可以进行一对一聊天。
客户端程序应该包含一个图形用户界面(GUI),以便用户可以输入消息并将其发送给服务器。服务器程序应该在后台接收来自客户端的消息并将其转发给相应的客户端。
下面是一个简单的客户端程序的示例代码:
```java
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Client extends JFrame {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private JTextArea chatArea;
private JTextField inputField;
public Client() {
chatArea = new JTextArea(10, 20);
chatArea.setEditable(false);
add(new JScrollPane(chatArea), BorderLayout.CENTER);
inputField = new JTextField();
inputField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
out.println(inputField.getText());
inputField.setText("");
}
});
add(inputField, BorderLayout.SOUTH);
setTitle("Chat Client");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
setVisible(true);
String serverAddress = JOptionPane.showInputDialog(
"Enter IP Address of the Server:");
socket = new Socket(serverAddress, 9898);
in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
while (true) {
String line = in.readLine();
if (line.startsWith("SUBMITNAME")) {
out.println(getName());
} else if (line.startsWith("NAMEACCEPTED")) {
inputField.setEditable(true);
} else if (line.startsWith("MESSAGE")) {
chatArea.append(line.substring(8) + "\n");
}
}
}
private String getName() {
return JOptionPane.showInputDialog(
"Choose a screen name:");
}
public static void main(String[] args) throws Exception {
Client client = new Client();
}
}
```
在这个示例程序中,客户端连接到服务器的IP地址为用户输入的地址。然后,它创建了一个GUI,其中包含一个文本框和一个聊天区域。每当用户在文本框中输入一条消息并按下回车键时,程序将消息发送到服务器。
下面是一个简单的服务器程序的示例代码:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
private static final int PORT = 9898;
private static HashSet<String> names = new HashSet<>();
private static HashSet<PrintWriter> writers = new HashSet<>();
public static void main(String[] args) throws Exception {
System.out.println("The chat server is running...");
ServerSocket listener = new ServerSocket(PORT);
try {
while (true) {
new Handler(listener.accept()).start();
}
} finally {
listener.close();
}
}
private static class Handler extends Thread {
private String name;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Handler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
while (true) {
out.println("SUBMITNAME");
name = in.readLine();
if (name == null) {
return;
}
synchronized (names) {
if (!names.contains(name)) {
names.add(name);
break;
}
}
}
out.println("NAMEACCEPTED");
writers.add(out);
while (true) {
String input = in.readLine();
if (input == null) {
return;
}
for (PrintWriter writer : writers) {
writer.println("MESSAGE " + name + ": " + input);
}
}
} catch (IOException e) {
System.out.println(e);
} finally {
if (name != null) {
names.remove(name);
}
if (out != null) {
writers.remove(out);
}
try {
socket.close();
} catch (IOException e) {
}
}
}
}
}
```
在这个示例程序中,服务器程序在端口9898上监听连接。每当客户端连接到服务器时,服务器创建一个新的线程来处理连接。线程使用输入/输出流来接收和发送消息,并将消息广播到所有已连接的客户端。
这只是一个简单的示例程序,您可以根据需要进行修改和扩展。希望这能帮助您开始编写自己的一对一聊天程序!