编写一个GUI界面的Socket聊天室(UDPChatGUl.java) 具体要求: (2)用Socket编程实现服务器端和客户端程序的编写。 (3)服务器端只负责好友列表的刷新,不负责客户端聊天信息的转发。
时间: 2024-02-20 09:02:00 浏览: 23
好的,我明白了。首先,让我们来了解一下Socket编程。Socket是一种用于网络通信的编程接口,它可以实现不同计算机之间的通信。在Socket编程中,服务器端和客户端通过Socket接口建立连接进行通信。
下面是一个基本的UDP聊天室GUI界面代码,包括服务器端和客户端程序的编写。其中,服务器端只负责好友列表的刷新,不负责客户端聊天信息的转发。
UDPChatGUI.java:
```java
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class UDPChatGUI extends JFrame implements ActionListener, Runnable {
private static final long serialVersionUID = 1L;
private DatagramSocket socket;
private InetAddress address;
private int port;
private int myPort;
private String myName;
private Thread thread;
private boolean running;
private JTextArea textArea;
private JTextField textField;
private JButton sendButton;
public UDPChatGUI(String name, String addr, int port, int myPort) {
super(name);
this.myName = name;
this.port = port;
this.myPort = myPort;
try {
socket = new DatagramSocket(myPort);
address = InetAddress.getByName(addr);
} catch (Exception e) {
e.printStackTrace();
}
JPanel panel = new JPanel(new BorderLayout());
textArea = new JTextArea();
textArea.setEditable(false);
panel.add(textArea, BorderLayout.CENTER);
JPanel bottomPanel = new JPanel(new GridLayout(1, 2));
textField = new JTextField();
bottomPanel.add(textField);
sendButton = new JButton("Send");
sendButton.addActionListener(this);
bottomPanel.add(sendButton);
panel.add(bottomPanel, BorderLayout.SOUTH);
add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);
running = true;
thread = new Thread(this);
thread.start();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == sendButton) {
String message = textField.getText();
textField.setText("");
if (message != null && message.trim().length() > 0) {
send(message);
}
}
}
private void send(String message) {
try {
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (running) {
try {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
if (message.startsWith("/list")) {
textArea.setText("");
String[] clients = message.substring(6).split(",");
for (int i = 0; i < clients.length; i++) {
textArea.append(clients[i] + "\n");
}
} else {
textArea.append(message + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
String name = args[0];
String addr = args[1];
int port = Integer.parseInt(args[2]);
int myPort = Integer.parseInt(args[3]);
new UDPChatGUI(name, addr, port, myPort);
}
}
```
在这个代码中,我们使用了Java的Swing库来创建了一个简单的GUI界面。在构造函数中,我们创建了一个DatagramSocket对象来与服务器进行通信。我们还创建了一个接收线程来接收来自服务器的消息。
在GUI界面中,我们使用了一个JTextArea来显示聊天记录,一个JTextField来输入聊天信息,和一个JButton来发送聊天信息。当用户点击发送按钮时,我们将输入框中的内容发送给服务器。
在接收线程中,我们不仅接收了服务器发送的聊天信息,还接收了来自服务器的好友列表信息。当收到好友列表信息时,我们清空文本框,并显示新的好友列表。否则,我们将聊天信息添加到文本框中。
UDPChatServer.java:
```java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UDPChatServer {
private DatagramSocket socket;
private List<String> clients;
private Map<String, Integer> ports;
public UDPChatServer(int port) {
try {
socket = new DatagramSocket(port);
clients = new ArrayList<String>();
ports = new HashMap<String, Integer>();
} catch (Exception e) {
e.printStackTrace();
}
}
public void start() {
while (true) {
try {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
String address = packet.getAddress().getHostAddress();
int port = packet.getPort();
if (message.startsWith("/join")) {
String name = message.substring(6);
clients.add(name);
ports.put(name, port);
sendList();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void sendList() {
StringBuilder sb = new StringBuilder("/list");
for (String client : clients) {
sb.append("," + client);
}
String message = sb.toString();
byte[] buffer = message.getBytes();
for (String client : clients) {
int port = ports.get(client);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, socket.getInetAddress(), port);
try {
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int port = Integer.parseInt(args[0]);
new UDPChatServer(port).start();
}
}
```
在服务器端,我们使用了一个DatagramSocket对象来监听来自客户端的消息。当收到客户端发送的加入请求时,我们将客户端的名字和端口号加入到列表中,并向所有客户端发送好友列表信息。
好的,以上就是一个基本的UDP聊天室GUI界面代码,包括服务器端和客户端程序的编写。其中,服务器端只负责好友列表的刷新,不负责客户端聊天信息的转发。