当前位置:

首页 > 编程开发 > Java基于TCP如何实现简单聊天程序

Java基于TCP如何实现简单聊天程序

一、如何实现TCP通信要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序,然后在编写客户端程序。在本机运行服务器端程序,在远程机运行客户端程序本机的IP地址:192.168.129.222远程机的IP地址:192.168.214.213二、编写C/S架构聊天程序1.编写服务器端程序-Server.java在net.hw.network包里创建Server类packagenet.hw.network;importjavax.swing.*;impor

本文目录

    一、如何实现TCP通信

    要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序,然后在编写客户端程序。

    在本机运行服务器端程序,在远程机运行客户端程序

    本机的IP地址:192.168.129.222

    Java基于TCP如何实现简单聊天程序

    远程机的IP地址:192.168.214.213

    Java基于TCP如何实现简单聊天程序

    二、编写C/S架构聊天程序

    1.编写服务器端程序 - Server.java

    在net.hw.network包里创建Server类

    Java基于TCP如何实现简单聊天程序

    package net.hw.network;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 功能:服务器端
     * 作者:华卫
     * 日期:2022年03月18日
     */
    public class Server extends JFrame {
        static final int PORT = 8136;
        static final String HOST_IP = "192.168.129.222";
    
        private JPanel panel1, panel2;
        private JTextArea txtContent, txtInput, txtInputIP;
        private JScrollPane panContent, panInput;
        private JButton btnClose, btnSend;
    
        private ServerSocket serverSocket;
        private Socket socket;
        private DataInputStream netIn;
        private DataOutputStream netOut;
    
        public static void main(String[] args) {
            new Server();
        }
    
        public Server() {
            super("服务器");
    
            //创建组件
            panel1 = new JPanel();
            panel2 = new JPanel();
            txtContent = new JTextArea(15, 60);
            txtInput = new JTextArea(3, 60);
            panContent = new JScrollPane(txtContent, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            panInput = new JScrollPane(txtInput, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            btnClose = new JButton("关闭");
            btnSend = new JButton("发送");
    
            //添加组件
            getContentPane().add(panContent, "Center");
            getContentPane().add(panel1, "South");
            panel1.setLayout(new GridLayout(0, 1));
            panel1.add(panInput);
            panel1.add(panel2);
            panel2.add(btnSend);
            panel2.add(btnClose);
    
            //设置组件属性
            txtContent.setEditable(false);
            txtContent.setFont(new Font("宋体", Font.PLAIN, 13));
            txtInput.setFont(new Font("宋体", Font.PLAIN, 15));
            txtContent.setLineWrap(true);
            txtInput.setLineWrap(true);
            txtInput.requestFocus();
            setSize(450, 350);
            setLocation(50, 200);
            setResizable(false);
            setVisible(true);
    
            //等候客户请求	
            try {
                txtContent.append("服务器已启动...\n");
                serverSocket = new ServerSocket(PORT);
                txtContent.append("等待客户请求...\n");
                socket = serverSocket.accept();
                txtContent.append("连接一个客户。\n" + socket + "\n");
                netIn = new DataInputStream(socket.getInputStream());
                netOut = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
    
            /
    
            //注册监听器,编写事件代码	
            txtContent.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    displayClientMsg();
                }
            });
    
            txtInput.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    displayClientMsg();
                }
            });
    
            panel2.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    displayClientMsg();
                }
            });
    
            txtInput.addKeyListener(new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                    displayClientMsg();
                }
            });
    
            txtInput.addFocusListener(new FocusAdapter() {
                public void focusGained(FocusEvent e) {
                    displayClientMsg();
                }
            });
    
            btnSend.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
    
                        String serverMsg = txtInput.getText();
                        if (!serverMsg.trim().equals("")) {
                            txtContent.append("服务器>" + serverMsg + "\n");
                            netOut.writeUTF(serverMsg);
                        } else {
                            JOptionPane.showMessageDialog(null, "不能发送空信息!", "服务器", JOptionPane.WARNING_MESSAGE);
                        }
    
                        txtInput.setText("");
                        txtInput.requestFocus();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                }
            });
    
            btnClose.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    try {
                        netIn.close();
                        netOut.close();
                        socket.close();
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    System.exit(0);
                }
            });
    
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    try {
                        netIn.close();
                        netOut.close();
                        socket.close();
                        serverSocket.close();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                    System.exit(0);
                }
    
                public void windowActivated(WindowEvent e) {
                    txtInput.requestFocus();
                }
            });
        }
    
        //显示客户端信息
        void displayClientMsg() {
            try {
                if (netIn.available() > 0) {
                    String clientMsg = netIn.readUTF();
                    txtContent.append("客户端>" + clientMsg + "\n");
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    2.编写客户端程序 - Client.java

    在net.hw.network包里创建Client类

    Java基于TCP如何实现简单聊天程序

    package net.hw.network;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * 功能:客户端
     * 作者:华卫
     * 日期:2022年03月18日
     */
    public class Client extends JFrame {
    
        private JPanel panel1, panel2;
        private JTextArea txtContent, txtInput;
        private JScrollPane panContent, panInput;
        private JButton btnClose, btnSend;
    
        private Socket socket;
        private DataInputStream netIn;
        private DataOutputStream netOut;
    
        public static void main(String[] args) {
            new Client();
        }
    
        public Client() {
            super("客户端");
    
            //创建组件
            panel1 = new JPanel();
            panel2 = new JPanel();
            txtContent = new JTextArea(15, 60);
            txtInput = new JTextArea(3, 60);
            panContent = new JScrollPane(txtContent, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            panInput = new JScrollPane(txtInput, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            btnClose = new JButton("关闭");
            btnSend = new JButton("发送");
    
            //添加组件
            getContentPane().add(panContent, "Center");
            getContentPane().add(panel1, "South");
            panel1.setLayout(new GridLayout(0, 1));
            panel1.add(panInput);
            panel1.add(panel2);
            panel2.add(btnSend);
            panel2.add(btnClose);
    
            //设置组件属性
            txtContent.setEditable(false);
            txtContent.setFont(new Font("宋体", Font.PLAIN, 13));
            txtInput.setFont(new Font("宋体", Font.PLAIN, 15));
            txtContent.setLineWrap(true);
            txtInput.setLineWrap(true);
            txtInput.requestFocus();
            setSize(450, 350);
            setLocation(550, 200);
            setResizable(false);
            setVisible(true);
    
            //连接服务器
            try {
                txtContent.append("连接服务器...\n");
                socket = new Socket(Server.HOST_IP, Server.PORT);
                txtContent.append("连接服务器成功。\n" + socket + "\n");
                netIn = new DataInputStream(socket.getInputStream());
                netOut = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e1) {
                JOptionPane.showMessageDialog(null, "服务器连接失败!\n请先启动服务器程序!", "客户端", JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }
    
            /
    
            //注册监听器,编写事件代码
            txtContent.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    displayServerMsg();
                }
            });
    
            txtInput.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    displayServerMsg();
                }
            });
    
            panel2.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    displayServerMsg();
                }
            });
    
            txtInput.addKeyListener(new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                    displayServerMsg();
                }
            });
    
            txtInput.addFocusListener(new FocusAdapter() {
                public void focusGained(FocusEvent e) {
                    displayServerMsg();
                }
            });
    
            btnSend.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
    
                        String clientMsg = txtInput.getText();
                        if (!clientMsg.trim().equals("")) {
                            netOut.writeUTF(clientMsg);
                            txtContent.append("客户端>" + clientMsg + "\n");
                        } else {
                            JOptionPane.showMessageDialog(null, "不能发送空信息!", "客户端", JOptionPane.WARNING_MESSAGE);
                        }
    
                        txtInput.setText("");
                        txtInput.requestFocus();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                }
            });
    
            btnClose.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
                        netIn.close();
                        netOut.close();
                        socket.close();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                    System.exit(0);
                }
            });
    
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    try {
                        netIn.close();
                        netOut.close();
                        socket.close();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                    System.exit(0);
                }
    
                public void windowActivated(WindowEvent e) {
                    txtInput.requestFocus();
                }
            });
        }
    
        //显示服务端信息
        void displayServerMsg() {
            try {
                if (netIn.available() > 0) {
                    String serverMsg = netIn.readUTF();
                    txtContent.append("服务器>" + serverMsg + "\n");
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    3.测试服务器端与客户端能否通信

    在本机[192.168.129.222]上启动服务器端

    Java基于TCP如何实现简单聊天程序

    在远程机[192.168.214.213]上启动客户端

    Java基于TCP如何实现简单聊天程序

    显示连接服务器[192.168.129.222]成功,切换到服务器端查看,显示连接了一个客户[192.168.214.213]

    Java基于TCP如何实现简单聊天程序

    此时,服务器端和客户端就可以相互通信了

    Java基于TCP如何实现简单聊天程序

    4.程序优化思路 - 服务器端采用多线程

    其实,很多服务器端程序都是允许被多个应用程序访问的,例如门户网站可以被多个用户同时访问,因此服务器端都是多线程的。

    Java基于TCP如何实现简单聊天程序

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。