以图形用户界面的形式完成Java即使聊天程序设计:可通过输入IP地址,端口号进行客户端服务器连接,连接以后可以发送文字,图片等信息,具体功能可以仿照qq
时间: 2024-03-07 15:53:39 浏览: 74
下面是一个基于Java图形用户界面的即时聊天程序设计,可以通过输入IP地址和端口号进行客户端服务器连接,连接后可以发送文字和图片等信息,界面类似于QQ:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ChatUI extends JFrame implements ActionListener, Runnable {
private JTextField messageField;
private JTextArea messageArea;
private JButton sendButton;
private JButton imageButton;
private JLabel statusLabel;
private Socket socket;
private DataInputStream inputStream;
private DataOutputStream outputStream;
public ChatUI() {
setTitle("Chat Application");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// 创建组件
messageField = new JTextField(30);
messageArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(messageArea);
sendButton = new JButton("Send");
imageButton = new JButton("Image");
statusLabel = new JLabel("Not connected");
// 添加组件
JPanel panel = new JPanel(new BorderLayout());
panel.add(messageField, BorderLayout.CENTER);
panel.add(sendButton, BorderLayout.EAST);
panel.add(imageButton, BorderLayout.WEST);
add(scrollPane, BorderLayout.CENTER);
add(panel, BorderLayout.SOUTH);
add(statusLabel, BorderLayout.NORTH);
// 添加事件监听器
messageField.addActionListener(this);
sendButton.addActionListener(this);
imageButton.addActionListener(this);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == sendButton || e.getSource() == messageField) {
String message = messageField.getText();
if (!message.isEmpty()) {
try {
outputStream.writeUTF(message);
messageArea.append("You: " + message + "\n");
messageField.setText("");
} catch (IOException ex) {
statusLabel.setText("Error: " + ex.getMessage());
}
}
} else if (e.getSource() == imageButton) {
JFileChooser fileChooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "jpeg", "png", "gif");
fileChooser.setFileFilter(filter);
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
outputStream.write(buffer);
messageArea.append("You sent an image: " + file.getName() + "\n");
} catch (IOException ex) {
statusLabel.setText("Error: " + ex.getMessage());
}
}
}
}
public void run() {
try {
socket = new Socket("localhost", 1234);
inputStream = new DataInputStream(socket.getInputStream());
outputStream = new DataOutputStream(socket.getOutputStream());
statusLabel.setText("Connected");
while (true) {
String message = inputStream.readUTF();
if (message.startsWith("IMAGE:")) {
int length = Integer.parseInt(message.substring(6));
byte[] buffer = new byte[length];
inputStream.readFully(buffer);
ImageIcon imageIcon = new ImageIcon(buffer);
messageArea.append("Peer sent an image: " + imageIcon.getDescription() + "\n");
JLabel imageLabel = new JLabel(imageIcon);
JOptionPane.showMessageDialog(this, imageLabel, "Received Image", JOptionPane.PLAIN_MESSAGE);
} else {
messageArea.append("Peer: " + message + "\n");
}
}
} catch (IOException ex) {
statusLabel.setText("Error: " + ex.getMessage());
} finally {
try {
if (socket != null) socket.close();
if (inputStream != null) inputStream.close();
if (outputStream != null) outputStream.close();
} catch (IOException ex) {
statusLabel.setText("Error: " + ex.getMessage());
}
}
}
public static void main(String[] args) {
ChatUI chatUI = new ChatUI();
Thread thread = new Thread(chatUI);
thread.start();
}
}
```
在这个例子中,我们创建了一个继承自JFrame的ChatUI类,并在构造函数中设置了标题,大小,关闭操作和位置。我们使用JTextField来让用户输入聊天消息,使用JTextArea来显示聊天记录,并使用JScrollPane添加滚动条功能。我们还创建了一个发送按钮和一个图片按钮,并使用JLabel显示当前连接状态。
我们将这些组件添加到JFrame中,并使用BorderLayout管理它们的位置。我们还添加了事件监听器,以便在用户输入聊天消息并单击发送按钮或按回车键时,将消息添加到聊天记录中。我们还添加了一个事件监听器,以便在用户单击图片按钮时,选择并发送图片。
我们还实现了Runnable接口,并在run方法中创建了一个Socket对象,并使用DataInputStream和DataOutputStream进行通信。我们使用while循环来接收来自服务器的消息,并在JTextArea中显示它们。如果接收到的消息以"IMAGE:"开头,则说明接收到的是图片,我们使用JOptionPane显示它。
当运行该程序时,将显示一个聊天窗口,用户可以在其中输入和发送聊天消息和图片,并且可以通过输入IP地址和端口号进行客户端服务器连接,界面类似于QQ。
阅读全文