赞
踩
本项目采用基于Java的`Swing`库进行图形界面开发,并使用`ServerSocket`和`Socket`进行网络通信。项目包名为`org.example.tcp`。
项目主要分为以下几个模块:
图形用户界面(GUI)模块
网络通信模块
线程处理模块
主窗口使用`JFrame`进行创建。需要设置窗口的标题、大小以及关闭操作。为了实现更灵活的布局管理,采用`BorderLayout`布局管理器。
- frame = new JFrame("Socket Chat Server");
-
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
- frame.setSize(400, 300);
-
- frame.setLayout(new BorderLayout();
聊天记录显示区域使用`JTextArea`进行实现,并设置为不可编辑以确保聊天记录的完整性。
为了支持滚动功能,将`JTextArea`放置在`JScrollPane`中,这样可以在聊天记录超出显示区域时进行滚动查看。
- chatArea = new JTextArea();
-
- chatArea.setEditable(false);
-
- JScrollPane scrollPane = new JScrollPane(chatArea);
-
- frame.add(scrollPane, BorderLayout.CENTER);
使用`JTextField`创建消息输入框,使用`JButton`创建发送按钮。将这两个组件放置在一个`JPanel`中,并使用`BorderLayout`布局管理器进行布局。
- inputField = new JTextField();
-
- sendButton = new JButton("Send");
为发送按钮添加点击事件监听器,当用户点击按钮时,触发发送消息的操作。
- sendButton.addActionListener(new ActionListener() {
-
- @Override
-
- public void actionPerformed(ActionEvent e) {
-
- sendMessage();
-
- }
-
- });
将输入框和按钮放置在`JPanel`中,并添加到主窗口的南部区域。
- JPanel inputPanel = new JPanel();
-
- inputPanel.setLayout(new BorderLayout());
-
- inputPanel.add(inputField, BorderLayout.CENTER);
-
- inputPanel.add(sendButton, BorderLayout.EAST);
-
- frame.add(inputPanel, BorderLayout.SOUTH);
-
- frame.setVisible(true);
在指定端口启动`ServerSocket`,并显示服务器启动信息到聊天区域。
- serverSocket = new ServerSocket(port);
-
- chatArea.append("Server started on port " + port + "\n");
调用`accept`方法阻塞等待客户端连接,接受连接后显示客户端连接信息到聊天区域。
- clientSocket = serverSocket.accept();
-
- chatArea.append("Client connected: " + clientSocket.getInetAddress().getHostAddress() + "\n");
从客户端的`Socket`中获取输入流`BufferedReader`和输出流`PrintWriter`,以进行消息传递。
- out = new PrintWriter(clientSocket.getOutputStream(), true);
-
- in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
为了不阻塞主线程,需要创建并启动一个新的线程来处理接收客户端消息的任务。在该线程中,循环读取客户端发送的消息,并将其显示在聊天区域。
- Thread receiveThread = new Thread(new Runnable() {
-
- @Override
-
- public void run() {
-
- String inputLine;
-
- try {
-
- while ((inputLine = in.readLine()) != null) {
-
- chatArea.append("Client: " + inputLine + "\n");
-
- }
-
- } catch (IOException e) {
-
- e.printStackTrace();
-
- }
-
- }
-
- });
-
- receiveThread.start();
在发送按钮的事件监听器中,获取输入框中的消息,使用输出流将消息发送到客户端,并在聊天区域显示发送的消息。
- private void sendMessage() {
-
- String message = inputField.getText();
-
- out.println(message);
-
- chatArea.append("服务端: " + message + "\n");
-
- inputField.setText("");
-
- }
在发送消息后,清空输入框以便用户输入下一条消息。
inputField.setText("");
这样,整个服务器端程序的设计和实现就介绍完毕了。通过以上步骤,我们创建了一个简单的Socket聊天服务器,具备图形用户界面,能够处理多次对话,并且可以发送和接收消息。客户端程序的设计和实现与服务器端类似,可以参照服务器端的思路进行开发。
4.运行截图
关于客户端在下一个帖子继续发,需要源码的可以私我哈
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。