Java TCP(一对一)聊天简易版

news2024/11/16 0:26:36

客户端

import java.io.*;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class MyClient {
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    JScrollPane scroll;
    MyClient(){
        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 {
        MyClient client=new MyClient();
        client.Win();
        client.Connect();
 
    }
}

服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class MyServer {
    //以下是聊天窗口的实现,上一篇文章有说过,不必多说
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    private JScrollPane scroll;
 
    MyServer() { 
        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 {
        MyServer server = new MyServer();
        server.Win();
        server.Connect();
    }
}

运行结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【概率论】MCMC 之 Gibbs 采样

上一篇文章讲到,MCMC 中的 HM 算法,它可以解决拒绝采样效率低的问题,但是实际上,当维度高的时候 HM 算法还是在同时处理多个维度,以两个变量 x [ x , y ] \mathbf{x} [x,y] x[x,y] 来说,也就是同时从联合…

【11】Qt Designer

目录 VSCode添加外部工具 QtDesigner PyUIC PyRCC 加载UI文件模板代码 QMainWindow QWidget 常用知识点 1. 修改标题图标 2. 图片资源管理 3. 图片按钮 4. 加载对话框 5. 动态加载Widget 6. 修改主题 其他注意事项 事件被多次触发 PyQt5提供了一个可视化图形工…

为什么微服务需要 API 网关?

本文我们主要讲解为什么微服务需要 API 网关。 对网关我们并不陌生,网关的概念来源于计算机网络,表示不同网络之间的关口。在系统设计中,网关也是一个重要的角色,其中最典型的是各大公司的开放平台,开放平台类网关是企…

【VRTK】【VR开发】【Unity】13-攀爬

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 VRTK提供两个预制件实现攀爬 Climbing Controller,用于控制Player的物理义体Climbable Interactable,用于设置可攀爬对象【设置Climbing Controller…

低多边形3D建模石头材质纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

【软考中级——软件设计师】备战经验 笔记总结分享

考试成绩 我第一次备考是在2022 然后那时候取消了这次是第二次 靠前我一个月复习的看了以前的笔记 然后刷了七八道历年题目学习资料推荐 :zst——2021 b站链接自荐一下我的笔记 : 软考笔记专栏 视频确实很长 , 我的建议就是先看笔记 然后不会…

论文查重率一般不超过多少【一文读懂】

大家好,今天来聊聊论文查重率一般不超过多少,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 论文查重率一般不超过多少 在学术界,论文查重是保证学术诚信和学术质量的重要手段快…

数据结构算法-希尔排序算法

引言 在一个普通的下午,小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐,更是要用扑克牌来决定谁是真正的“大老板”。 然而,小明的牌就像刚从乱麻中取出来的那样,毫无头绪。小森的牌也像是被小丑掷…

JVM 性能调优及监控诊断工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解

目录 一. 前言 二. jps(Java Virtual Machine Process Status Tool) 三. jstack 四. jmap(Memory Map)和 jhat(Java Heap Analysis Tool) 五. jstat(JVM统计监测工具) 六. hpro…

数据结构和算法-单链表

数据结构和算法-单链表 1. 链表介绍 链表是有序的列表,但是它在内存中是存储如下 图1 单链表示意图 小结: 链表是以节点的方式存储每个节点包含data域,next域,指向下一个节点。如图:发现链表的各个节点不一定是连续存储。比如地…

持续集成交付CICD:Jenkins配置Nexus制品上传流水线

目录 一、实验 1.Jenkins配置制品上传流水线 二、问题 1.上传制品显示名称有误 一、实验 1.Jenkins配置制品上传流水线 (1) 新建流水线项目 (2)描述 (3)添加参数 (4)查看构建首页 (5&…

windows系统安装RocketMQ_dashboard

1.下载源码 按照官网说明下载源码 官网 官网文档 2.源码安装 2.1.① 编译rocketmq-dashboard 注释掉报错的maven插件frontend-maven-plugin、maven-antrun-plugin mvn clean package -Dmaven.test.skiptrue2.2.② 运行rocketmq-dashboard java -jar target/rocketmq-…

网络层重点协议——IP协议详解

✏️✏️✏️今天给大家分享的是网络层的重点协议——IP协议。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈️✈️动动你们发财的…

【Linux】进程和环境变量

我们启动一个软件,本质就是启动一个进程 在Linux下,运行一条命令,运行的时候,其实就是在系统层面创建了一个进程 而Linux系统管理大量进程则是先描述,再组织 进程 对应的代码和数据 进程等对应的PCB结构体 PCB包含了…

【深度学习】注意力机制(一)

本文介绍一些注意力机制的实现,包括SE/ECA/GE/A2-Net/GC/CBAM。 目录 一、SE(Squeeze-and-Excitation) 二、ECA(Efficient Channel Attention) 三、GE(Gather-Excite) 四、A2-Net(Double A…

Stable Diffusion AI绘画系列【23】:赛博朋克-机甲美女系列

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

任意文件上传漏洞实战和防范

文件上传漏洞广泛存在于Web1.0时代,恶意攻击者的主要攻击手法是将可执行脚本(WebShell)上传至目标服务器,以达到控制目标服务器的目的。 此漏洞成立的前提条件至少有下面两个: 1.可以上传对应的脚本文件,…

Java 8 新特性深度解析:探索 Lambda 表达式、Stream API 和函数式编程的革新之路

Java8 新特性 Java 8 的革新之路 自 1995 年首次发布以来,Java 已经成为世界上最广泛使用的编程语言之一。随着时间的推移,Java 经历了多次版本更新,其中最具里程碑意义的便是 Java 8 的发布。这个版本引入了许多重大变革,包括 …

vivado时序方法检查11

TIMING-47 &#xff1a; 同步时钟之间的伪路径、异步时钟组或仅最 大延迟数据路径约束 在 <clock_group> 与 <clock_group> 这两个时钟之间设置了 <message_string> 时序约束 &#xff08; 请参阅 VivadoIDE 的“ Timing Constraint ”窗口中的约束位…

Oracle(2-13) RMAN Complete Recove

文章目录 一、基础知识1、Restoration Using RMAN利用RMAN进行恢复2、Relocate a Tablespace 重新定位表空间 二、基础操作1、恢复前的准备2、恢复数据库3、恢复单个数据文件4、在数据库打开的情况下恢复 RMAN Complete Recove RMAN完全恢复 目标&#xff1a; 了解RMAN用于恢复…