TCP聊天

一、项目创建

二、代码

Client类

package tcp;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) {try {Socket socket =new Socket("127.0.0.1",8888);System.out.println("连接成功!");new ClientSend(socket).start();new Clientreive(socket).start();} catch (IOException e) {e.printStackTrace();}}
}
/*** 用于发送消息线程类*/
class ClientSend extends Thread{@Overridepublic void run() {this.sendMsy();}private Socket socket;public ClientSend(Socket socket){this.socket  =socket;}/*** 发送消息*/private void sendMsy(){Scanner scanner =null;PrintWriter pw =null;try{scanner =new Scanner(System.in);pw =new PrintWriter(this.socket.getOutputStream());while(true){String str =scanner.nextLine();pw.println(str);pw.flush();}}catch (Exception e){e.printStackTrace();}finally {if (scanner!=null){scanner.close();}if (pw!=null){pw.close();}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}/***用于接收消息线程类*/
class Clientreive extends Thread{private Socket socket=null;public Clientreive(Socket socket){this.socket =socket;}@Overridepublic void run() {this.receiveMsg();}/*** 用于接收对方消息*/private void receiveMsg(){BufferedReader br =null;try{br =new BufferedReader(new InputStreamReader(this.socket.getInputStream()));while(true){String mr = br.readLine();System.out.println("小明:"+mr);}}catch (Exception e){e.printStackTrace();}finally {if (br!=null){try {br.close();} catch (IOException e) {e.printStackTrace();}}}}
}

Server类

package tcp;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;/*** 发送消息线程*/
class Send extends Thread{private Socket socket;public Send(Socket socket){this.socket  =socket;}@Overridepublic void run() {this.sendMsy();}/*** 发送消息*/private void sendMsy(){Scanner scanner =null;PrintWriter pw =null;try{scanner =new Scanner(System.in);pw =new PrintWriter(this.socket.getOutputStream());while(true){String str =scanner.nextLine();pw.println(str);pw.flush();}}catch (Exception e){e.printStackTrace();}finally {if (scanner!=null){scanner.close();}if (pw!=null){pw.close();}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}/*** 接收消息的线程*/
class receive extends Thread{private Socket socket=null;public receive(Socket socket){this.socket =socket;}@Overridepublic void run() {this.receiveMsg();}/*** 用于接收对方消息*/private void receiveMsg(){BufferedReader br =null;try{br =new BufferedReader(new InputStreamReader(this.socket.getInputStream()));while(true){String mr = br.readLine();System.out.println("小红说:"+mr);}}catch (Exception e){e.printStackTrace();}finally {if (br!=null){try {br.close();} catch (IOException e) {e.printStackTrace();}}}}
}public class Server {public static void main(String[] args) {ServerSocket serverSocket =null;try{serverSocket =new ServerSocket(8888);System.out.println("服务端已启动等待连接");Socket socket = serverSocket.accept();System.out.println("连接成功!");new Send(socket).start();new receive(socket).start();}catch(Exception e){e.printStackTrace();}finally {if (serverSocket!=null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

三、运行结果

先运行服务端

再运行客服端

按Enter键切换聊天人物

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

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

相关文章

电子学会C/C++编程等级考试2022年06月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:公共子序列 我们称序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, ..., ik >,使得对j = 1, 2, ... ,k, 有xij = zj。比如Z = < a, b, f, c &…

QT Windos平台下打包应用程序

一、windeployqt.exe windeployqt&#xff1a;是 Qt 框架自带的一个工具&#xff0c;用于将一个 Qt 应用程序在 Windows 操作系统下进行打包。它可以通过扫描应用程序的依赖项获取所需的 Qt 库文件、插件和翻译文件&#xff0c;以及复制应用程序可执行文件和所需的依赖项到指定…

电商价格数据监测接口/品牌商品控价接口/商品数据分析接口/比价搜索API接口,超详细的接口说明

电商价格数据监测API接口是一种用于监测电商平台上商品价格的API接口&#xff0c;可以帮助品牌和商家及时获取商品价格信息&#xff0c;掌握价格动态&#xff0c;进行价格对比和分析&#xff0c;以更好地制定价格策略和进行价格调整。 该接口可以监测多个电商平台的商品价格信…

VM:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize256m; support was removed in 8.0 “JDK 8兼容性指南” 指出&#xff0c;在Java 8中&#xff0c;命令行标志 MaxPermSize 已被删除。原因是永久代从热点堆中被移除并被转移到本地内存。所以为了删除…

【C++】:搜索二叉树

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关多态的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

C语言之动态内存管理(malloc calloc realloc)

C语言之动态内存管理 文章目录 C语言之动态内存管理1. 为什么要有动态内存管理2. malloc 和 free2.1 malloc2.2 free2.3 例子 3. calloc 和 realloc3.1 calloc3.2 realloc 4. 常见的动态内存错误4.1 对NULL指针的解引⽤操作4.2 对动态开辟空间的越界访问4.3 对⾮动态开辟内存使…

女装品牌网站建设的作用如何

服装是任何人都需要的必备品&#xff0c;尤其是女装&#xff0c;由于女性群体爱美追求时尚的心理更高&#xff0c;因此市场中有大量女装品牌以及大量消费者&#xff0c;其规模非常高&#xff0c;众多大小品牌林立及消费征集下&#xff0c;商家们经营也并不太容易&#xff0c;企…

Themis: Fast, Strong Order-Fairness in Byzantine Consensus

目录 笔记后续的研究方向摘要引言秩序井然 Themis: Fast, Strong Order-Fairness in Byzantine Consensus CCS 2023 笔记 后续的研究方向 摘要 我们介绍了Themis&#xff0c;这是一种将交易的公平排序引入&#xff08;许可的&#xff09;拜占庭共识协议的方案&#xff0c;最…

参加百度Apollo技术沙龙—感受自动驾驶的魅力

2023年12月2日下午2点&#xff0c;我有幸参加了百度Apollo技术沙龙&#xff0c;这是一个围绕Apollo新版本Beta的全面升级展开的深度交流活动。作为一名工程师&#xff0c;我深感荣幸能够与众多同行和专家一同探讨自动驾驶技术的快速发展 在这次沙龙中&#xff0c;我了解到Apo…

Python:核心知识点整理大全7-笔记

目录 4.2.5 遗漏了冒号 4.3 创建数值列表 4.3.1 使用函数 range() 4.3.2 使用 range()创建数字列表 结果如下&#xff1a; 4.3.3 对数字列表执行简单的统计计算 4.3.4 列表解析 4.4 使用列表的一部分 4.4.1 切片 4.4.2 遍历切片 4.4.3 复制列表 4.2.5 遗漏了冒号 fo…

使用vue-quill-editor(富文本框)禁用粘贴图片

问题描述&#xff1a;富文本框复制粘贴未走上传图片接口&#xff0c;会将复制的图片解析为base64编码&#xff0c;为了控制这种情况可选择禁用粘贴图片&#xff0c;或者监听有复制粘贴的图片走上传图片接口 获取到 quill 对象&#xff0c;可以通过 refs 或者 Quill 对象的 getI…

小程序自动更新功能

小程序自动更新功能 在 .vue 页面的 script 中添加生命周期&#xff0c;在生命周期内监听页面信息 onLoad onLoad(options) {this.getUserInfo()this.intervalId setInterval(() > {this.getUserInfo()}, 3000);},onUnload onUnload: function() {// 在页面卸载时清除定时…

vue的data

类型&#xff1a;Object | Function 限制&#xff1a;组件的定义只接受 function。 详细&#xff1a; Vue 实例的数据对象。Vue 会递归地把 data 的 property 转换为 getter/setter&#xff0c;从而让 data 的 property 能够响应数据变化。对象必须是纯粹的对象 (含有零个或多个…

DC电源模块与节能环保的关系

BOSHIDA DC电源模块与节能环保的关系 随着全球能源危机的加剧&#xff0c;环保节能已经成为世界各国政府和企业发展的主要方向。在电子行业中&#xff0c; DC电源模块的出现为环保节能做出了贡献。DC电源模块是一种电源供应器件&#xff0c;可将高电压转换为低电压&#xff0c;…

柏林噪声C++

柏林噪声 随机噪声 如上图所示随机噪声没有任何规律可言&#xff0c;我们希望生成有一些意义的局部连续的随机图案 一维柏林噪声 假设希望生成一段局部连续的随机曲线&#xff0c;可以采用插值的方式&#xff1a;在固定点随机分配y值&#xff08;一般是整数点&#xff09;&a…

【数据分析实战】酒店行业华住集团门店分布与评分多维度分析

文章目录 1. 写在前面2. 数据集展示3. 多维度分析3.1 门店档次多元化&#xff1a;集团投资战略观察3.1.1 代码实现3.1.2 本人浅薄理解 3.2 门店分布&#xff1a;各省市分布概览3.2.1 代码实现3.2.2 本人浅薄理解 3.3 门店分级评分&#xff1a;服务水平的多维度观察3.3.1 代码实…

F5怎么样?从负载均衡到云原生的进阶之路

从Web时代开始至云原生时代的应用服务交付的市场&#xff0c;技术与人的变化就是关注的焦点。从单纯的Web负载均衡到复杂的企业应用交付&#xff0c;从单体应用到分布式、微服务架构&#xff0c;F5为企业技术架构更好、更优、更安全的运行做出了极大的努力。那么F5怎么样&#…

Vue 循环走马灯

1、使用 transform: translateX()&#xff0c;循环将滚动内容在容器内偏移&#xff0c;超出容器部分隐藏&#xff1b; 2、避免滚动到末尾时出现空白&#xff0c;需要预留多几个。 3、一次循环偏移的距离scrollLoopWidth 可能受样式影响需要做些微调&#xff0c;比如单个item的…

题目:分糖果(蓝桥OJ 2928)

题目描述&#xff1a; 解题思路&#xff1a; 本题采用贪心思想 图解 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e6 9; char s[N];//写字符串数组的一种方法,像数组一样***int main() {int n, x;cin >> n >> x;for(int …

CSS新手入门笔记整理:元素类型相互转换

元素类型 块元素&#xff08;block&#xff09; 独占一行&#xff0c;排斥其他元素跟其位于同一行&#xff0c;包括块元素和行内元素。块元素内部可以容纳其他块元素和行内元素。可以定义 width&#xff0c;也可以定义 height。可以定义 4 个方向的 margin。 行内元素&#xf…