基于Java实现Socket编程的方法


这篇文章主要介绍“基于Java实现Socket编程的方法”,在日常操作中,相信很多人在基于Java实现Socket编程的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Java实现Socket编程的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!socket,又称套接字,是在不同的进免费云主机域名程间进行网络通讯的一种协议、约定或者说是规范。对于socket编程,它更多的时候像是基于TCP/UDP等协议做的一层封装或者说抽象,是一套系统所提供的用于进行网络通信相关编程的接口。我们以linux操作系统提供的基本api为例,了解建立一个socket通信的基本流程:可以看到本质上,socket是对tcp连接(当然也有可能是udp等其他连接)协议,在编程层面上的简化和抽象。首先,我们从只发送和接收一次消息的socket基础代码开始:服务端:客户端:先运行服务端,再运行客户端,就可以看到效果。注意这里的IO操作实现,我们使用了一个大小为MAX_BUFFER_SIZE的byte数组作为缓冲区,然后从输入流中取出字节放置到缓冲区,再从缓冲区中取出字节构建到字符串中去,这在输入流文件很大时非常有用,事实上,后面要讲到的NIO也是基于这种思路实现的。上面的例子只实现了一次单向的通信,这显然有点浪费通道。socket连接支持全双工的双向通信(底层是tcp),下面的例子中,服务端在收到客户端的消息后,将返回给客户端一个回执。并且我们使用了一些java.io包装好的方法,来简化整个通信的流程(因为消息长度不大,不再使用缓冲区)。服务端:客户端:注意这里我们在服务端接受到消息以及客户端发送消息后,分别调用了shutdownInput()shutdownOutput()而不是直接close对应的stream,这是因为在关闭任何一个stream,都会直接导致socket的关闭,也就无法进行后面回执的发送了。但是注意,调用shutdownInput()shutdownOutput()之后,对应的流也会被关闭,不能再次向socket发送/写入了。刚才的两个例子中,每次打开流,都只能进行一次写入/读取操作,结束后对应流被关闭,就无法再次写入/读取了。在这种情况下,如果要发送两次消息,就不得不建立两个socket,既耗资源又麻烦。其实我们完全可以不关闭对应的流,只要分次写入消息就可以了。但是这样的话,我们就必须面对另一个问题:如何判断一次消息发送的结束呢?最简单的办法是使用一些特殊的符号来标记一次发送完成,服务端只要读到对应的符号就可以完成一次读取,然后进行相关的处理操作。下面的例子中我们使用换行符n来标记一次发送的结束,服务端每接收到一个消息,就打印一次,并且使用了Scanner来简化操作:服务端:客户端:运行后效果是,客户端每输入一行文字按下回车后,服务端就会打印出对应的消息读取记录。回到原点,我们之所以不好定位消息什么时候结束,是因为我们不能够确定每次消息的长度。那么其实可以先将消息的长度发送出去,当服务端知道消息的长度后,就能够完成一次消息的接收了。总的来说,发送一次消息变成了两个步骤发送消息的长度发送消息最后的问题就是,“发送消息的长度”这一步骤所发送的字节量必须是固定的,否则我们仍然会陷入僵局。一般来说,我们可以使用固定的字节数来保存消息的长度,比如规定前2个字节就是消息的长度,不过这样我们能够传送的消息最大长度也就被固定死了,以2个字节为例,我们发送的消息最大长度不超过2^16个字节即64K。如果你了解一些字符的编码,就会知道,其实我们可以使用变长的空间来储存消息的长度,比如:第一个字节首位为0:即0XXXXXXX,表示长度就一个字节,最大128,表示128B
第一个字节首位为110,那么附带后面一个字节表示长度:即110XXXXX 10XXXXXX,最大2048,表示2K
第一个字节首位为1110,那么附带后面二个字节表示长度:即110XXXXX 10XXXXXX 10XXXXXX,最大131072,表示128K
依次类推当然这样实现起来会麻烦一些,因此下面的例子里我们仍然使用固定的两个字节来记录消息的长度。服务端:客户端:在考虑服务端处理多连接之前,我们先考虑使用多线程改造一下原有的一对一对话实例。在原有的例子中,消息的接收方并不能主动地向对方发送消息,换句话说我们并没有实现真正的互相对话,这主要是因为消息的发送和接收这两个动作并不能同时进行,因此我们需要使用两个线程,其中一个用于监听键盘输入并将其写入socket,另一个则负责监听socket并将接受到的消息显示。出于简单考虑,我们直接让主线程负责键盘监听和消息发送,同时另外开启一个线程用于拉取消息并显示。消息拉取线程 ListenThread.java主线程,启动时由用户选择是作为server还是client:

相关推荐: Css技术中线性渐变的示例分析

小编给大家分享一下Css技术中线性渐变的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对象选择器 {background:-浏览器前缀-linear-gradient( 起点…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/13 19:04
下一篇 01/13 19:05

相关推荐