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

客户端

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 blocke1.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 blocke1.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 blocke1.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 blocke1.printStackTrace();}}}).start(); //用start开启线程}}public static void main(String[] args) throws Exception {MyServer server = new MyServer();server.Win();server.Connect();}
}

运行结果如下:

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

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

相关文章

C语言 题目

1.写一个函数算一个数的二进制(补码)表示中有几个1 #include<stdio.h>//统计二进制数中有几个1 //如13:1101 //需要考虑负数情况 如-1 结果应该是32// n 1101 //n-1 1100 //n 1100 //n-1 1011 //n 1000 //n-1 0111 //n 0000 //看n的变化 int funca(int c){int co…

css:flex布局中子元素高度height没有达到100%

目录 问题flex布局示例解决办法方式一方式二 参考 问题 css中使用flex布局中子元素高度height没有达到100% flex布局示例 希望实现两个盒子左右分布&#xff0c;内容垂直居中对齐 <style>.box {display: flex;align-items: center;border: 1px solid #eeeeee;}.box-l…

【ceph】ceph生产常见操作之一---ceph扩容以及注意事项

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

react新旧生命周期钩子

以下的内容根据尚硅谷整理。 旧生命钩子 辅助理解&#xff1a; 红色框&#xff1a;挂载时生命钩子蓝色框&#xff1a;更新时生命钩子绿色框&#xff1a;卸载时生命钩子 挂载时 如图所示&#xff0c;我们可以看到&#xff0c;在组件第一次挂载时会经历&#xff1a; 构造器&a…

stateflow——如何查看状态机中参数变化及状态机断点调试

法一&#xff1a;使用Data Inspector 点击“符号图窗”和“属性”&#xff0c;如图&#xff1b;在选择变量n并右键点击inspector&#xff0c;最后在logging&#xff0c;如图 法二&#xff1a;log active state 和法一类似使用data inspector查看&#xff0c;类似的查看方法和…

【每周一测】Java阶段四第三周学习

目录 1、关于分布式锁的说法&#xff0c;错误的是&#xff08; &#xff09; 2、JDK动态代理产生的代理类和委托类的关系是 3、下列关于ElasticSearch中基本概念描述错误的是 4、Spring Cloud 中&#xff0c;Feign 是什么&#xff1f; 5、在JavaScript中&#xff0c;可以使…

玩转大数据13: 数据伦理与合规性探讨

1. 引言 随着科技的飞速发展&#xff0c;数据已经成为了现代社会的宝贵资产。然而&#xff0c;数据的收集、处理和利用也带来了一系列的伦理和合规性问题。数据伦理和合规性不仅关乎个人隐私和权益的保护&#xff0c;还涉及到企业的商业利益和社会责任。因此&#xff0c;数据…

韵达快递单号查询,以表格的形式导出单号的每一条物流信息

批量查询韵达快递单号的物流信息&#xff0c;并以表格的形式导出单号的每一条物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册…

SOP(标准作业程序)和WI(操作指导书)的联系和区别

目录 1.SOP&#xff08;标准作业程序&#xff09;&#xff1a;2.WI&#xff08;操作指导书&#xff09;&#xff1a;3.SOP和WI的区别&#xff1a; 1.SOP&#xff08;标准作业程序&#xff09;&#xff1a; SOP: 所谓SOP&#xff0c;是 Standard Operation Procedure三个单词中…

【计算机网络实验】实验三 IP网络规划与路由设计(头歌)

目录 一、知识点 二、实验任务 三、头歌测试 一、知识点 IP子网掩码的两种表示方法 32位IP子网掩码&#xff0c;特点是从高位开始连续都是1&#xff0c;后面是连续的0&#xff0c;它有以下两种表示方法&#xff1a; 传统表示法&#xff0c;如&#xff1a;255.255.255.0IP前…

【WebSocket】使用ws搭建一个简单的在线聊天室

前言 什么是WebSockets&#xff1f; WebSockets 是一种先进的技术。它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此 API&#xff0c;你可以向服务器发送消息并接收事件驱动的响应&#xff0c;而无需通过轮询服务器的方式以获得响应。 webscokets 包括webscoket…

中科院分区和JCR分区有什么区别

文章目录 名词解释学科划分不同参考的影响因子不同期刊分区不同期刊分区阈值不同 名词解释 中科院分区&#xff1a;又称“中科院JCR分区”&#xff0c;是中国科学院文献情报中心世界科学前沿分析中心的科学研究成果&#xff0c;期刊分区表数据每年底&#xff08;每年12月中下旬…

汽车继电器

汽车继电器 电子元器件百科 文章目录 汽车继电器前言一、汽车继电器是什么二、汽车继电器的类别三、汽车继电器的应用实例四、汽车继电器的作用原理总结前言 汽车继电器作为一种电子设备,广泛应用于汽车电路中的各种控制和保护任务,能够可靠地控制和传送电能,确保汽车系统的…

Python爬虫-实现批量抓取王者荣耀皮肤图片并保存到本地

前言 本文是该专栏的第12篇,后面会持续分享python爬虫案例干货,记得关注。 本文以王者荣耀的英雄皮肤为例,用python实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…

低代码:美味膳食或垃圾食品

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…

ubuntu串口永久权限

ubuntu串口永久权限 临时打开串口权限 sudo chmod 666 /dev/ttyUSB0该方法只能临时添加访问权限&#xff0c;一次性的&#xff0c;下次拔插串口线或者开关机还需要再次赋予串口权限。 永久打开串口权限 首先查看用户组 ls -l /dev/ttyUSB0终端输出&#xff1a; crw-rw-rw…

从零开始搭建链上dex自动化价差套利程序(11)

风险控制 需要将仓位杠杆控制到3倍以内&#xff0c;由于dydx与apex没有获取仓位杠杆的接口&#xff0c;但是每次发送交易的数额可以决定&#xff0c;故而可以设置每次发送总仓位1.5倍杠杆的数额&#xff0c;然后设置一个变量保证每个方向上的交易不超过2次&#xff0c;即可保证…

数据结构和算法-单链表

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

滑动窗口练习(三)— 加油站问题

题目 测试链接 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组…

如何教会小白使用淘宝API接口获取商品数据

随着互联网的普及&#xff0c;越来越多的人开始接触网络购物&#xff0c;而淘宝作为中国最大的电商平台之一&#xff0c;成为了众多消费者首选的购物平台。然而&#xff0c;对于一些小白用户来说&#xff0c;如何通过淘宝API接口获取商品数据可能是一个难题。本文将详细介绍如何…