给出用java实现基于TCP socket的图形化点对点聊天应用的代码并给出每部分解释
时间: 2024-02-13 13:05:40 浏览: 26
以下是一个简单的Java实现基于TCP socket的图形化点对点聊天应用的代码,该应用可以在两个客户端之间实现聊天:
```java
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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;
import javax.swing.JTextField;
public class ChatServer {
private JFrame frame;
private JTextField textField;
private JTextArea textArea;
private JButton btnSend;
private JPanel panel;
private JScrollPane scrollPane;
private ServerSocket serverSocket;
private Socket clientSocket;
private PrintWriter out;
private BufferedReader in;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChatServer window = new ChatServer();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public ChatServer() {
initialize();
startServer();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textField = new JTextField();
frame.getContentPane().add(textField, BorderLayout.SOUTH);
textField.setColumns(10);
panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(new BorderLayout(0, 0));
scrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.CENTER);
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
btnSend = new JButton("Send");
btnSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String message = textField.getText();
out.println(message);
textArea.append("Me: " + message + "\n");
textField.setText("");
}
});
panel.add(btnSend, BorderLayout.EAST);
}
/**
* Start the server.
*/
private void startServer() {
try {
serverSocket = new ServerSocket(9000);
textArea.append("Waiting for client...\n");
clientSocket = serverSocket.accept();
textArea.append("Client connected.\n");
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
Thread receiveThread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
String message = in.readLine();
textArea.append("Client: " + message + "\n");
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
});
receiveThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
这个应用程序主要由以下几个部分组成:
1. `initialize()`:该方法初始化应用程序的图形用户界面(GUI),包括一个文本输入框、一个文本区域用于显示聊天消息、一个“发送”按钮,以及用于排列组件的面板和滚动面板。
2. `startServer()`:该方法启动服务器并等待客户端连接。一旦客户端连接成功,服务器将使用输入/输出流与客户端进行通信,并启动一个线程来接收来自客户端的消息并将它们显示在文本区域中。
3. `main()`:该方法启动应用程序的主界面。
在这个应用程序中,服务器等待客户端连接并接收来自客户端的消息,然后将它们显示在文本区域中。当用户在文本输入框中键入消息并单击“发送”按钮时,该应用程序将该消息发送到客户端。