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.rhkb.cn/news/212908.html

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

相关文章

数据结构 / 队列 / 循环队列 / 概念

1. 定义 为充分利用向量空间,克服假溢出现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储…

C语言期末考试复习PTA数据类型及表达式-分支结构程序-循环结构-数组经典选择题

目录 第一章:C语言数据类型和表达式 第一题: 第二题: 第三题: 第四题: 第五题: 第六题: 第七题: 第八题: 第九题: 第二章:分支结构程序…

服务器配置免密SSH

在当今互联网时代,远程工作和网络安全已成为信息技术领域的热点话题。无论是管理远程服务器、维护网络设备还是简单地从家中连接到办公室,安全始终是首要考虑的因素。这就是为什么 SSH(Secure Shell)成为了网络专业人士的首选工具…

Jmeter基础和概念

JMeter 介绍: 一个非常优秀的开源的性能测试工具。 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来。 从性能工具的原理划分: Jmeter工具和其他性能工具在原理上完全一致,工具包含4个部分&#xff1a…

Flutter开发笔记 —— 图像缩略图功能实战

Flutter开发笔记 —— 图像缩略图功能实战 插件应用列表效果图功能分析scrollable_positioned_list插件应用滑动控制器滑动监听器应用 结束语 大家在做图像浏览或部分关于图像的项目时,难免会遇到缩略图的相关功能,特地写了一个demo给大家进行分享&#…

从浅入深掌握进阶结构体(C语言)

前言 这一期我们将继续讲解结构体的知识,还没有看过上一期的小伙伴一定要赶紧去学习哦。 上一期,冲鸭! 那么话不多说我们开始今天的学习吧! 文章目录 1,结构体的自引用2,匿名结构体3,位段4,结构体的传参5,尾声 1,结构体的自引用 …

数据库备份脚本

#!/bin/bash #数据库备份 #工具:xtrabackupif [ ! -d /xtrabackup/ ];thenmkdir /xtrabackup/{full,inter,diff} -p fito_mail15191876750163.com db_userroot db_passwdAren123 basedir/xtrabackup/full/ baseinter/xtrabackup/inter/ basediff/xtrabackup/diff/ f…

【SSM源码】基于JAVA的高校竞赛和考级查询系统

该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍: 二、文档学习资料: 三、模块截图: 四、开发技术与运行环境: 五、代码展示: 六、数据库表截图&#xff1a…

uniapp-hubildx配置

1.配置浏览器 (1)运行》运行到浏览器配置》配置web服务器 (2)选择浏览器安装路径 (3)浏览器安装路径: (3.1) 右键点击图标》属性 (3.2)选择目标&…

系统设计-微服务架构

典型的微服务架构图 下图展示了一个典型的微服务架构。 负载均衡器:它将传入流量分配到多个后端服务。CDN(内容交付网络):CDN 是一组地理上分布的服务器,用于保存静态内容以实现更快的交付。客户端首先在 CDN 中查找内…

《opencv实用探索·十四》VideoCapture播放视频和视像头调用

1、VideoCapture播放视频 #include <opencv2/opencv.hpp> #include <iostream>using namespace std; using namespace cv;int main() {// 定义相关VideoCapture对象VideoCapture capture;// 打开视频文件capture.open("1.avi");// 判断视频流读取是否正…

案例064:基于微信小程序的考研论坛设计

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

问题:batchnormal训练单个batch_size就会报错吗

Batch Normalization&#xff08;批标准化&#xff09;是一种深度学习中的正则化技巧&#xff0c;它可以改进网络的训练过程。在训练神经网络时&#xff0c;Batch Normalization可以帮助解决内部协变量偏移&#xff08;Internal Covariate Shift&#xff09;的问题。 在标准的…

软件测试--selenium安装使用

安装selenium不少人使用pip命令来安装selenium&#xff0c;辛辛苦苦安装完之后&#xff0c;还是不能使用。所以我们可以是直接使用编译器&#xff0c;pycharm直接安装selenium扩展包。 file中点击settings 在Settings中点击Project Interpreter,点击加号就可以安装各种需要的扩…

Docker安装postgres最新版

1. postgres数据库 PostgreSQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是关于PostgreSQL的一些介绍&#xff1a; 开源性&#xff1a;PostgreSQL是一个开源项目&#xff0c;可以…

One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记

One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记 Abstract 一对一&#xff08;o2o&#xff09;标签分配对基于变换器的端到端检测起着关键作用&#xff0c;最近已经被引入到全卷积检测器中&#xff0c;用于端到端密集检测。然而&#xff0c;o2o可能因为…

docker镜像仓库hub.docker.com无法访问

docker镜像仓库hub.docker.com无法访问 文章主要内容&#xff1a; 介绍dockerhub为什么无法访问解决办法 1 介绍dockerhub为什么无法访问 最近许多群友都询问为什么无法访问Docker镜像仓库&#xff0c;于是我也尝试去访问&#xff0c;结果果然无法访问。 大家的第一反应就是…

flutter开发实战-ValueListenableBuilder实现局部刷新功能

flutter开发实战-ValueListenableBuilder实现局部刷新功能 在创建的新工程中&#xff0c;点击按钮更新counter后&#xff0c;通过setState可以出发本类的build方法进行更新。当我们只需要更新一小部分控件的时候&#xff0c;通过setState就不太合适了&#xff0c;这就需要进行…

MQTT协议对比TCP网络性能测试模拟弱网测试

MQTT正常外网压测数据---时延diff/ms如下图&#xff1a; MQTT弱网外网压测数据 TCP正常外网压测数据 TCP弱网外网压测数据 结论&#xff1a;

这些接口自动化测试工具如果不知道,就真out了!

一、Postman Postman是一款广受欢迎的API测试工具&#xff0c;除了手动发送HTTP请求的基本功能&#xff0c;它还提供了自动化测试和脚本测试的功能&#xff0c;非常适合进行HTTP接口的自动化测试。 二、Rest-Assured Rest-Assured是一个Java库&#xff0c;专为REST服务的测试…