Java简易版 TCP协议一对一聊天

客户端

package 二十一章;
 
import java.io.*;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class Server {
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    JScrollPane scroll;
    Server(){
        jf=new JFrame("客户端");
        jBsend =new JButton("发送");
        jTAcontent =new JTextArea(13,40);
        jText =new JTextField(12);
        scroll=new JScrollPane(jTAcontent,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条
        JLcontent=new JLabel("聊天记录");
        jPanel=new JPanel();
    }
    public void Win()
    {
        Box boxVBox=Box.createVerticalBox();
        boxVBox.add(JLcontent);
        boxVBox.add(Box.createVerticalStrut(5));
        boxVBox.add(scroll);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jText);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jBsend);
        boxVBox.add(Box.createVerticalStrut(10));
        jPanel.add(boxVBox);
        jf.add(jPanel);
        jf.setSize(600, 400);
        jf.setResizable(false);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
   
    public void Connect() throws Exception{
        Socket sk= new Socket("127.0.0.1",1200);
        jBsend.addActionListener(e->{ //Lambda表达式实现点击按钮发送信息   
            String str=jText.getText(); //获取文本框内容
            if (str.matches("\\s+") || str.equals("")) {
                JOptionPane.showMessageDialog(jf, "不可发送空白内容");
                return;
            }
            try {
                jTAcontent.append("我:"+str+"\n"); //文本区添加文本框内容
                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //字符流发送信息
                bw.write(str); //发送文本框的信息给对方
                bw.newLine(); //发送后换行
                bw.flush(); //立即发送
                //不用bw.close(),为了可以一直发送信息
                jText.setText("");
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            new Thread(()->{ //Lambda表达式创建线程
                while(true){ //死循环随时接受信息
                try {
                    BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream())); //以字符流接受信息
                    String read = br.readLine(); //一行一行接受信息
                    jTAcontent.append("客服:"+read+"\n");
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                }
            }).start(); //开启线程
        });
    }
    public static void main(String[] args) throws Exception {
        Server client=new Server();
        client.Win();
        client.Connect();
 
    }
}

服务端:

package 二十一章;
 
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class Client {
    //以下是聊天窗口的实现,上一篇文章有说过,不必多说
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    private JScrollPane scroll;
 
    Client() { 
        jf = new JFrame("服务端");
        jBsend = new JButton("发送");
        jTAcontent = new JTextArea(13, 40);
        jText = new JTextField(12);
        scroll = new JScrollPane(jTAcontent, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条
        JLcontent = new JLabel("聊天记录");
        jPanel = new JPanel();
    }
 
    public void Win() {
        Box boxVBox = Box.createVerticalBox(); //这里应用了垂直盒式布局模式排列组件
        boxVBox.add(JLcontent);
        boxVBox.add(Box.createVerticalStrut(5));
        boxVBox.add(scroll);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jText);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jBsend);
        boxVBox.add(Box.createVerticalStrut(10));
        jPanel.add(boxVBox);
        jf.add(jPanel);
        jf.setSize(600, 400);
        jf.setResizable(false);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 
    public void Connect() throws Exception {
        ServerSocket ss = new ServerSocket(1200);
        while (true) {
            Socket sk = ss.accept();
                jBsend.addActionListener(e -> { //按钮响应事件,实现点击按钮发送信息
                    String str = jText.getText(); //获取文本框的内容
                    try {
                        jTAcontent.append("我:" + str + "\n");
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //以字符流发送信息
                        bw.write(str); //将文本框内容发送给对方
                        bw.newLine(); //发送后换行
                        bw.flush(); //立即发送
                        //不用bw.close(),为了可以一直发送信息
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    jText.setText("");
                });
                new Thread(() -> { //开启线程,这里是为了服务端可同时接收到多个客户端信息
                while (true) { //设置死循环,用于随时接受信息
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); //字符流方式接受信息
                        String read = br.readLine(); //以字符串方式一行一行接受到信息
                        jTAcontent.append("客户:" + read + "\n"); //将接收的信息写入文本区
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }).start(); //用start开启线程
        }
    }
 
    public static void main(String[] args) throws Exception {
        Client server = new Client();
        server.Win();
        server.Connect();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/231837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

冒泡排序和直接选择排序(C/C++实现)

文章目录 冒泡排序(交换排序)基本思想特性总结代码实现 直接选择排序基本思想特性总结代码实现(优化,每次循环同时选择最小和最大的数) 冒泡排序(交换排序) 基本思想 基本思想:所谓交换,就是根…

【数据结构】循环队列

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 🎏队列顺序存储的不足 🎏循环队列的定义 🎏设计循环队列 结语 🎏队列顺序存储的不足 我们假设用一个可以存放为n个数据…

人工智能AIGC培训讲师叶梓介绍及AI强化学习培训提纲

叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。个人主页:大数据人工智能AI培训讲师叶…

栈和队列的互相实现

用队列实现栈 OJ链接 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返…

Qexo博客后台管理部署

Qexo博客后台管理部署 个人主页 个人博客 参考文档 https://www.oplog.cn/qexo/本地部署 采用本地Docker部署管理本地Hexo 下载代码包 若无法下载使用科学工具下载到本地在上传到服务器 wget https://github.com/Qexo/Qexo/archive/refs/tags/3.0.1.zip# 解压 unzip Qexo…

Python 中检查一个数是不是另一个数的整数次幂

更多资料获取 📚 个人网站:ipengtao.com 在数学和计算中,确定一个数是否为另一个数的整数次幂是一个常见而重要的问题。例如,我们可能需要判断一个数是否是某个数的平方、立方或其他幂次。本文将探讨在Python中如何实现这一功能&…

算数运算符和算数表达式

基本算数运算符 算数运算符: (加法运算符或正值运算符)、-(减法运算符或负值运算符)、*(乘)、/(除)、%(求余数) 双目运算符: 双目…

【QED】小樱的问题

目录 题目描述输入格式输出格式 测试样例样例说明 思路核心代码 题目描述 在 f u f u fufu fufu乐园,每天都会有各种各样精彩的内容发生。就比如说,今天,小樱的米饭店开张啦! 为了吸引 f u f u fufu fufu们前来购买小樱的大米&a…

唱响主旋律——建行江门市分行推动服务实体经济高质量发展

建行江门市分行主动对接当地战略部署,在侨乡热土踏歌而行,全力当好服务实体经济的主力军和维护金融稳定的压舱石,在助力再造一个现代化新江门上贡献建行力量。 输血实体 为实体经济服务是金融的天职。建行江门市分行积极发挥在重大基建领域…

异步回调模式

异步回调 所谓异步回调,本质上就是多线程中线程的通信,如今很多业务系统中,某个业务或者功能调用多个外部接口,通常这种调用就是异步的调用。如何得到这些异步调用的结果自然也就很重要了。 Callable、Future、FutureTask publi…

C/C++之输入输出

文章目录 一.C语言的输入输出1.printfi. 输出整数ii. 浮点数iii.字符 & 字符串 2.scanfi.整数ii.浮点数iii. 字符 & 字符串 3.特殊用法i. * 的应用ii. %n 的应用iii. %[] 的应用 二.C中的输入输出1.couti. 缓冲区(buffer)ii. cout之格式化输出 2…

python爬虫学习-批量爬取图片

python爬虫学习-批量爬取图片 爬虫步骤爬取前十页图片到本地根据页码获取网络源码使用xpath解析网页解析网页并下载图片主函数如下 爬取的网站为站长素材(仅做学习使用) 爬取的目标网站为 https://sc.chinaz.com/tupian/qinglvtupian.html如果爬取多页&…

有什么进销存软件能对接微信小程序?

有什么进销存软件能对接微信小程序? 据我所知,很多进销存软件都有配套的微信小程序吧。 以我们现在用的这个为例,这也是同行推荐过来的,很好用,而且性价比很高—— 在线平台,无需下载APP,搭载…

Python Cupy 模块:加速大规模数值计算

更多资料获取 📚 个人网站:ipengtao.com Cupy是一个基于NumPy的库,专门设计用于在GPU上进行高性能计算。它提供了与NumPy相似的API,因此用户可以很容易地将现有的NumPy代码迁移到Cupy上,从而充分利用GPU的并行计算能力…

Java数据结构06——树

1.why: 数组&链表&树 2. 大纲 2.1前中后序 public class HeroNode {private int no;private String name;private HeroNode left;//默认为nullprivate HeroNode right;//默认为nullpublic HeroNode(int no, String name) {this.no no;this.name name;}public int …

基于Python的前程无忧、51job、智联招聘等招聘网站数据获取及数据分析可视化大全【代码+演示】

需要本项目的可以私信博主,获取,或者文末卡片获取 import pandas as pd import glob import warnings warnings.filterwarnings("ignore")# 指定目录 directory ./data/# 使用glob来获取所有.xlsx文件 excel_files glob.glob(directory *.x…

软件科技成果鉴定测试需提供哪些材料?

为了有效评估科技成果的质量,促进科技理论向实际应用转化,所以需要进行科技成果鉴定测试。申请鉴定的科技成果范围是指列入国家和省、自治区、直辖市以及国务院有关部门科技计划内的应用技术成果,以及少数科技计划外的重大应用技术成果。   …

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(下,很详细考试必过)

项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一,进度问题在项目生命周期内引起的冲突最多。 小型项目中,定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切,可以视为一…

Bash脚本处理ogg、flac格式到mp3格式的批量转换

现在下载的许多音乐文件是flac和ogg格式的,QQ音乐上下载的就是这样的,这些文件尺寸比较大,在某些场合使用不便,比如在车机上播放还是mp3格式合适,音质这些在车机上播放足够了,要求不高。比如本人就喜欢下载…

unity 2d 入门 飞翔小鸟 Cinemachine 镜头跟随小鸟 多边形碰撞器 解决镜头不会穿模问题(十二)

1、安装 window->package manager 2、创建Cinemachine 右键->Cinemachine->2D Carmera 3、创建空对象和多边形控制器如图 记得勾选 is Trigger 空对象位置记得要和小鸟保持一致,不然等下写完脚本后,镜头一开始会移动一下 4、将多边形触…