首页 > 编程语言 >接上篇,客户端实现,图形界面编程,利用socket和UCP/TCP编写,客户端和服务器端程序可以进行多次对话

接上篇,客户端实现,图形界面编程,利用socket和UCP/TCP编写,客户端和服务器端程序可以进行多次对话

时间:2024-06-05 16:32:28浏览次数:13  
标签:BorderLayout 服务器端 创建 图形界面 new 客户端 frame Socket

 1. 项目结构

 1.1 基本架构

本项目采用基于Java的`Swing`库进行图形界面开发,并使用`Socket`进行网络通信。项目包名为`org.example.tcp`。

 1.2 模块划分

项目主要分为以下几个模块:

图形用户界面(GUI)模块

网络通信模块

线程处理模块

 2. GUI设计

 2.1 主窗口设计

 2.1.1 创建主窗口

主窗口使用`JFrame`进行创建。需要设置窗口的标题、大小以及关闭操作。为了实现更灵活的布局管理,采用`BorderLayout`布局管理器。

frame = new JFrame("Socket Chat Client");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(400, 300);

frame.setLayout(new BorderLayout());

 2.2 聊天记录显示区域

 2.2.1 创建并设置`JTextArea`

聊天记录显示区域使用`JTextArea`进行实现,并设置为不可编辑以确保聊天记录的完整性。

 2.2.2 添加滚动功能

为了支持滚动功能,将`JTextArea`放置在`JScrollPane`中,这样可以在聊天记录超出显示区域时进行滚动查看。

chatArea = new JTextArea();

chatArea.setEditable(false);

JScrollPane scrollPane = new JScrollPane(chatArea);

frame.add(scrollPane, BorderLayout.CENTER);

 2.3 输入区域和发送按钮

 2.3.1 创建输入框和按钮

使用`JTextField`创建消息输入框,使用`JButton`创建发送按钮。将这两个组件放置在一个`JPanel`中,并使用`BorderLayout`布局管理器进行布局。

inputField = new JTextField();

sendButton = new JButton("Send");

 2.3.2 添加按钮点击事件

为发送按钮添加点击事件监听器,当用户点击按钮时,触发发送消息的操作。

sendButton.addActionListener(new ActionListener() {

    @Override

    public void actionPerformed(ActionEvent e) {

        sendMessage();

    }

});

 2.3.3 布局输入区域

将输入框和按钮放置在`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);

 3. 网络通信

 3.1 连接服务器

 3.1.1 创建`Socket`

使用指定的服务器地址和端口号,创建一个连接到服务器的`Socket`。

socket = new Socket(serverAddress, serverPort);

 3.1.2 获取输入输出流

从服务器的`Socket`中获取输入流`BufferedReader`和输出流`PrintWriter`,以进行消息传递。

out = new PrintWriter(socket.getOutputStream(), true);

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

 3.2 处理服务器消息

 3.2.1 创建并启动消息接收线程

为了不阻塞主线程,需要创建并启动一个新的线程来处理接收服务器消息的任务。在该线程中,循环读取服务器发送的消息,并将其显示在聊天区域。

Thread receiveThread = new Thread(new Runnable() {

    @Override

    public void run() {

        String message;

        try {

            while ((message = in.readLine()) != null) {

                chatArea.append("Server: " + message + "\n");

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

});

receiveThread.start();

 3.3 发送消息

 3.3.1 实现消息发送功能

在发送按钮的事件监听器中,获取输入框中的消息,使用输出流将消息发送到服务器,并在聊天区域显示发送的消息。

private void sendMessage() {

    String message = inputField.getText();

    out.println(message);

    chatArea.append("客户端: " + message + "\n");

    inputField.setText("");

}

 3.3.2 清空输入框

在发送消息后,清空输入框以便用户输入下一条消息。

inputField.setText("");

 4. 启动客户端

 4.1 启动方法

 4.1.1 主方法

在`main`方法中,创建`ClientGUI`实例并启动客户端,连接到本地的服务器端口。

public static void main(String[] args) {

    ClientGUI client = new ClientGUI();

    client.start("localhost", 6666); // 连接到本地的服务器端口

}

通过以上步骤,我们就能创建一个简单的Socket聊天客户端,具备图形用户界面,能够处理多次对话,并且可以发送和接收消息。服务器端程序的设计和实现与客户端类似,可以参照客户端的思路进行开发。

运行结果如下:

标签:BorderLayout,服务器端,创建,图形界面,new,客户端,frame,Socket
From: https://blog.csdn.net/ogykkk/article/details/139475462

相关文章

  • Redis——Java的客户端
    Java的客户端在Redis官网中提供了各种语言的客户端,地址:https://redis.io/clientsjedisjedis的官网地址:https://github.com/redis/jedis1.引入依赖<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0......
  • Git客户端工具:SourceTree for Mac v 4.1.5中文特别版
    SourceTree是一款由Atlassian公司推出的免费的Git和Mercurial版本控制系统的可视化客户端工具。它提供了一种简单易用的方式来管理和查看代码的版本历史,以及进行代码的比较、合并和提交等操作。用户可以通过SourceTree轻松地管理多个代码仓库,并且可以直观地查看代码的变化和提......
  • Windows下载安装RabbitMQ客户端(2024最新篇)
    文章目录RabbitMQ认知RabbitMQ下载RabbitMQ安装更多相关内容可查看RabbitMQ认知定义:RabbitMQ是一个消息中间件,它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里。RabbitMQ与快递站......
  • 利用进程池给客户端传文件
    主函数#include<func.h>#include"process_pool.h"#include"server.h"#include"transferFd.h"#defineEVENTSNUM100intmain(intargc,char*argv[]){//ipportprocessNumif(argc!=4){error(1,errno,"......
  • C++代码实现一个简易http服务端,返回给客户端一张图片
    注意事项sprintf读取字符串时,遇到\0会结束,所以不能用sprintf来读取*pictureBuffervoid*memcpy(void*str1,constvoid*str2,size_tn),str2会覆盖str1里的内容代码#include<func.h>charpictureBuffer[150*1024];charbuffer[200*1024];intmain(){in......
  • 内网部署api接口文档服务器端口如何让外网访问?
    计算机业内人士对于swagger并不陌生,不少人选择用swagger做为API接口文档管理。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器端的代......
  • 【Redis】 使用Java操作Redis的客户端
    文章目录......
  • 智密腾讯云直播组建--客户端API简介
    客户端API指的是伴随着Demo提供的ZhimiTRTCLiveRoomSDK,常见于(工程目录/utils/ZhimiTRTCLiveRoom/sdk.js),并且以开放对象的方式重新包装一次对外开放,可参考(工程目录/utils/ZhimiTRTCLiveRoom/index.js),该包装方式主要是方便开发者扩展自己对应的功能,从而不必重复导入,导出等工作......
  • Ubuntu图形界面下无设置图标且无法打开设置的解决办法
    如有不足之处,还请指正。1.确认网络连接正常网络测试方法:1.pingbaidu.com```pingbaidu.com```2.直接打开浏览器尝试能否搜索如果网络已经处于有线连接状态,可以ping通,但浏览器无法进行联网搜索这时只能通过重启1到3次来尝试连接到互联网2.安装gnome-control-center......
  • 基于WebSocket的modbus通信(二)- 客户端
    上一篇已经实现了ModbusTcp服务器和8个主要的功能码,只是还没有实现错误处理功能。但是在测试客户端时却发现了上一篇的一个错误,那就是写数据成功,服务器不需要响应。接下来要做的就是实现ModbusTcp客户端。有了清晰的协议,代码循规蹈矩的写就行了。效果原始数据其中只读寄存......