JavaTCP通信(双项通信、一对一通信、一对多)

目录

双项通信:

 优化1:

优化2:

一对多: 

 总结:一对一通信,一对多通信都是TCP通信的实现,都是双项通信,只有在两机之间连接之前,才有服务端和客户端的区分,而在连接之后就不在有服务端和客户端了,双方都可以互相发送消息


首先需要声明:部分图片来自百战尚学堂

客户端(Socket)和服务端(ServerSocket)连接的前提是主机之间已经通过TCP协议进行了三次握手,客户端和服务端建立连接的基础是主机之间已经通过TCP协议通信的基础之上的

而服务端和客户端在连接之后就没有主客之分了

单项通信我们上一篇文章已经讲过了,今天我们来讲讲双项通信:

单项通信就是客户端固定位发送端,服务端固定为接收端。而双项通信是没有固定的发送端和接收端,双方都可以互相通信,此时我们通过代码讲解一下:

双项通信:

首先我们需要创建服务端ServerSocket对象,因为如果先创建客户端那客户端跟谁连接呢?然后服务端传递参数监听8888端口,然后通过accept方法获取监听器对象,此时这个方法会导致线程阻塞,直到监听器对象连接到客户端才会返回就绪状态

服务端需等待客户端发送的信息,然后服务端才能向客户端发送信息

然后我们创建客户端Socket对象,通过构造方法并传递服务器的IP地址,以及端口号8888,我们需要先向服务端发送信息,才能接收服务端发送的信息

 此时我们就可以通过运行服务端和客户端实现双项通信

 优化1:

但是我们的代码还是不够完善,因为客户端和服务端接收消息都是在同一个线程里的,那么就肯定会涉及到先后的问题而且只能读一句,那么我们在聊天的时候不可能只跟别人说一句话吧,此时我们就需要对代码进行更改,将发送信息和接收消息变为两个线程,让他们并发运行

 首先我们现在服务端实现一个发送消息的线程关于代码如何写的,我的注释都有解释,大家请耐心观看一下

 然后我们创建接收消息的线程,代码的实现逻辑注释都有解释 

然后就是我们的主线程了,此时我们可以看到我们将对应客户端的Socket对象从try的小括号里移了出来因为这个主线程在运行完之后就会死亡,那么try-with-resource这种语法就会将小括号里可以关的都关闭,如果对应客户端的Socket对象关闭了,那么发送消息的线程和接收消息的线程通过什么获取输入输出流呢?所以对应客户端的Socket对象不能在主线程死亡的时候关闭

 而服务端此时的代码就优化完毕了,现在我们来写客户端的发送和接收线程,其实客户端的线程是和服务端一样的所以我们就直接复制了

而客户端的主线程也是一样,客户端Socket对象不能在主线程死亡的时候关闭,所以我们这里就不能使用try-with-resource语法,就用普通的try{...}catch(){...}

验证点对点通信

优化2:

 但是我们可以发现好像这个点对点通信的代码还可以优化,我们看昂,这个服务端和客户端在连接过后就没有主客之分了,而服务端和客户端都有一串相同的代码,那就是发送消息的线程和接收消息的线程,那我们能不能将服务端和客户端写到同一个类中呢?

显然是可以的此时我们创建一个新的类来优化服务端和客户端 

首先我们在主类中创建输入,当输入为server,<port>的时候创建服务端,当输入为<IP>,<port>的时候创建客户端,然后将输入通过split()方法拆分,通过if判断split拆分的数组的第一个元素是否为server,当我们创建好服务端/客户端对象后,创建发送消息and接收消息的线程

 发送消息的线程还是和刚刚写的一样:

 接收消息的线程也一样

此时我们可以通过两次运行此类来创建服务端和客户端,如果不能运行两次同样的类的,找到上边栏的这个按钮

 然后点击这个进行配置

然后点击这个

选择允许多实例

 然后就可以运行两次相同类了 ,然后我们就可以无限制的发送消息和接收消息了,因为这是两个线程并发运行的,互不干扰

一对多: 

那么学到了这里大家应该已经会了点对点的通信了,那么我们可以实现一下一对多的通信,一对多的通信其实很简单嘛,就是将服务端的监听方法accept()方法循环一下不就可以实现监听器一直循环端口了吗,那此时不就形成了一对多的通信了吗

如果没有理解我们通过代码来实现看看:

我们就还是通过之前的代码更改一下,改的地方不多就在监听端口的时候给了个死循环让服务端一直监听某个端口监听到数据过后返回服务端所对应的Socket对象并且每个对应的服务端Socket对象都创建接收消息和发送消息的线程并启动

而服务端没啥区别,就是把下面创建线程的代码放到了else里边,其实放外边也没所谓,一样的效果

 此时我们运行此类,一个服务端,两个客户端

 总结:一对一通信,一对多通信都是TCP通信的实现,都是双项通信,只有在两机之间连接之前,才有服务端和客户端的区分,而在连接之后就不在有服务端和客户端了,双方都可以互相发送消息

 明天我们来写通过TCP实现聊天室

c_mmmmmmm
关注 关注
  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java网络编程详解(三)TCP通信程序
筱寒小记
06-28 760
一、什么是TCP通信TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务器(Server) 两端通信时步骤: 服务端程序,需要事先启动,等待客户端的连接。 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。 在Java中,提供了两个类用于实现TCP通信程序: 3. 客户端:java.net.Socket类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。 4. 服务端:java.net.Server.
TCP 通信程序学习
InterestAndFun的博客
12-01 2102
1. TCP通信原理 ​ TCP 通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。 ​ Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。 ​ Java为客户端提供了Socket类,为服务器端提供了 ServerSocket类。 2. TCP发送数据 ​ 发送数据的步骤 1. 创建客户端的Socket对象
网络编程【TCP单向通信TCP双向通信一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
07-11 2218
网络编程【TCP单向通信TCP双向通信一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
---随笔--Java实现TCP通信(双端通信接收与发送)
最新发布
qq_41120902的博客
05-13 911
设计一个基于最基本Socket的P2P“聊天软件”(文本互传),要求在同一个网关内可以通过任意常用端口建立会话并进行socket通讯、双向文本收发。
Java实现TCP客户端和服务器端相互通信
qq_48300973的博客
05-27 2476
服务器端和客户端写完后加上client.shutdownOutput();服务器端和客户端写完后加上client.shutdownOutput();服务器端和客户端读完后加上client.shutdownInput();服务器端和客户端读完后加上client.shutdownInput();运行,程序未停止运行且服务器端也没有输出,客户端发过来的消息。运行服务器端再运行客户端,在客户端中输入要发送的信息,回车。解决TCP客户端和服务器通信读不到数据的问题。想让服务器端回信息,结果翻车了。
JAVA实现全双工通信(TCP/IP),简单多人聊天界面
oxygen2223的博客
04-25 1398
基于网络通信TCP/IP协议,通过ip地址实现多台机器进行通话。
java socket通信 一对多
04-18
1)设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。 2)服务端程序能响应单个或任意多个客户端...
Java一对多通信(NetBeans)
09-11
Java网络编程,NetBeans工程,利用线程池管理实现TCP通信中的一对多通信通信协议为“knock knock游戏”
基于java实现Socket套接字一对一聊天系统源码+项目说明.zip
07-05
基于java实现Socket套接字一对一聊天系统源码+项目说明.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者...
java 基础知识之网络通信TCP通信、UDP通信、多播以及NIO)总结
08-31
Java 基础知识之网络通信Java 语言中不可或缺的一部分,包括 TCP 通信、UDP 通信、多播以及 NIO 等多种形式。下面将对这些知识点进行详细的解释。 TCP 通信 TCP(Transmission Control Protocol)是一种可靠的...
java Socket与C#通信中中文乱码问题的解决方案
12-22
近正在做一个项目,其中遇到了一个问题是java与.NET之间的通信问题。具体的问题是这样的:  客户端使用java服务器端使用的是C#。两者之间使用基于TCP的Socket通信方式。可是,做了一个测试小例子,结果从客户端...
Java实现基于TCP协议的Socket通信
08-11
(1)实现了服务器和客户端之间的连接通信 (2)实现了客户端与客户端之间的连接通信
TCP一对多通信_基于MFC多线程
01-31
我用MFC VC6编写的一个 TCP 一对多通信的程序,就是服务器端利用多线程技术(不使用Select等任何模型), 能同时接收多个客户端的消息, 其次, 服务器端还能将消息群发给所有已连接的客户端, 实现的基本思路 是将每个线程中 accept函数返回的套接字 都保存到一个套接字数组中,套接字地址也保存到一个数组中。然后在“群发”的 按钮消息中,用for循环 遍历套接字数组,循环执行 send函数将消息发送给套接字数组中所有的套接字。 该程序简单完整,非常适合初学者研究WinSock一对多通信
Java网络编程之TCP通信完整代码示例
08-28
主要介绍了Java网络编程之TCP通信完整代码示例,具有一定借鉴价值,需要的朋友可以了解下。
TCP一对多通信_基于MFC多线程(VS2010版)
04-29
我用MFC VS2010编写的一个 TCP 一对多通信的程序,就是服务器端利用多线程技术(不使用Select等任何模型), 能同时接收多个客户端的消息, 其次, 服务器端还能将消息群发给所有已连接的客户端, 实现的基本思路 是将每个线程中 accept函数返回的套接字 都保存到一个套接字数组中,套接字地址也保存到一个数组中。然后在“群发”的 按钮消息中,用for循环 遍历套接字数组中的每个套接字,对每个套接字都使用send函数发送消息。
java tcp通信
06-17
TCP实现2个程序间的文件传输。 一个服务器一个客户端 二者传输文件
JAVA实现TCP通信
热门推荐
商林松的博客
05-03 4万+
TCPJava支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构、交换方式、包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议、TCP协议和UDP协议。现在TCP/IP协议族中的主要socket类型为流套接字(使用TCP协议)和数据报套接字(使用UDP协议)。 TCP协议提供面向连接的服务,通过它建立的是可靠地连接。JavaTCP协议提供
Java中的TCP通信简单使用
TheCalm的博客
08-04 2189
Java中,一般使用SocketServer和Socket这两个类实现TCP通信,前者为服务端的一个实体,而后者可以认为是一种对连接的封装。一般来说,需要先启动服务端,然后客户端才能向服务端发送连接请求,连接成功后,两端就可以互相通信了。
Java实现TCP
weixin_51597979的博客
04-23 656
实现的功能是Client向Server发送“你好你好”消息。用Java编写的客户端代码如下;用Java编写的服务端代码如下;从连接通道中获取输入流的数据。从连接通道中获取输出流。
优化modbus通讯的方法,以及java示例
12-03
优化Modbus TCP通讯在Java编程中是一项重要的任务,它涉及到多个层面的性能提升,包括网络、数据处理、错误处理和缓存等方面。以下是几个关键点的详细阐述: 1. **网络优化**: - **带宽与延迟**:优化网络环境,...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
94
原创
37
点赞
195
收藏
16
粉丝
关注
私信
写文章

热门文章

  • SpringBoot入门 7954
  • Maven总结 3330
  • Java客户端和服务端连接与单项通信 3065
  • JavaTCP通信(双项通信、一对一通信、一对多) 2990
  • MyBatisPlus入门 2333

分类专栏

  • 接口 1篇

最新评论

  • Linux常用命令

    jnhgukjhyu: 可以把百战程序员Linux的资料分享一下吗?

  • 肝了一个下午把MySQL所有常用命令总结了一遍

    m0_71474050: alter table emp add constraint emp_fk foreign key(deptno) reference dept(deptno); (更改表:emp表添加约束(约束名empfk)外键(外键名deptno)参考dept表的(deptno))

  • Redis总结

    Xd聊架构: 大佬文章如此优秀,过来支持一下!

  • BUG:Exception processing template “/backstage/a1“: An error happene

    get嘤嘤嘤: 感谢博主分享,一整篇满满的干货,深度好文必须三连。欢迎您来我的博客指点。ヾ(@゜▽゜@)ノ

  • lombok入门

    雁南飞渡: 作为程序员来说,最重要的还是你的学习能力和技术水平,英雄可以不问出处, 不管你是来自于北大清华,还是来自于北大青鸟。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • SpringSecurity的编写流程
  • bfs算法和dfs算法
  • Vue基础总结
2023年20篇
2022年74篇

目录

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司大运企业网站设计福永网络推广坑梓SEO按效果付费平湖阿里店铺托管宝安网站优化东莞外贸网站建设大鹏阿里店铺托管光明网站优化按天扣费坪地网络营销龙岗网站搭建大芬SEO按天收费吉祥企业网站建设荷坳seo优化南山网站优化软件坂田SEO按天扣费大运百姓网标王推广大鹏企业网站改版丹竹头网页设计光明英文网站建设吉祥百度竞价包年推广宝安优秀网站设计同乐网站优化按天计费同乐网站设计模板龙岗网页制作沙井百姓网标王推广横岗如何制作网站坑梓seo优化民治网站改版吉祥关键词按天收费盐田网站seo优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化