java Tcp udp

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011433762/article/details/80247311

网络通信

不用具体了解TCP/IP协议的内容。只需要知道,通过调用相关的对象,对象的内部会使用这些协议来工作的。

TCP对等通信模型:

Socket服务器<<————>>Socket客户端

 

ServerSocket对象

服务器端对象,用于开通端口号,负责监听接收客户端发送的请求连接信息,并且返回Socket对象,此socket对象代表与客户端的连接接口。通过这个接口可以实现与客户端的通信。

servletsocket方法有:

accept()--处于接收状态,此时程序会“阻塞”,直到接收到为止!但是可以设置超时,超时后也能继续运行。默认超时是永久。

getReceiveBufferSize(),获取接收缓存区的大小。

setSoTimeout(int timeout),设置连接超时,也就是阻塞时间。

Socket对象

通信的接口。创建Scoket对象时,系统会自动分配发送和接收缓存区,大小默认为8192字节。

提供的方法有:

getInputStream()----接收数据的输入流

getOutputStream() --发送数据的输出流

getReceiveBufferSize()-接收区缓存大小

getSendBufferSize()----发送区缓存大小

发送过程:获取输出流,向输出流内写数据。

接收过程:获取输入流,读取输入流内的数据。

l 发送的数据会被先写入到缓存区内,等缓存区满了,自动发出。也可以通过flush的方式强制发送出去。自动发送多少数据量依据接收方接收缓存区大小,直到填满接收方缓存区。对端每次读取一部分数据以后,缓存区会删除这部分数据,空出位置继续接收。

l 由此可见发送和接收过程是相互协商的。发送区数据少于接收区接收大小时,接收区会接收所有的数据,发送区数据多于接收区缓存大小的时候,会先根据接收区大小发送部分数据。

注意:

直接关闭socket,它的流会被关闭;

直接关闭它的输出流,它也会被关闭;

使用socket.shoutdownoutput可以关闭输出流而不关闭socket,但是现在还没办法打开。不知道这有什么意义!

发送的字符会先存放到缓存区,而不是直接发送,等缓存区满了才发送。

并且你flush也是没用的,但是close是可以强行发送的???

阻塞传输

网络传输中的阻塞问题:阻塞就是线程暂停

l 连接阻塞:一般没有什么大问题

l 写阻塞

在向流中写数据的时候程序会处于阻塞状态。直到写完所有数据或者抛出异常。当缓存内的数据还没有被发送出去的时候就会出现写阻塞。缓存满了,此时数据写不进去缓存。这种情况在发送大数据的时候会看到,但是发送小数据的时候一般不会出现这种阻塞。如果写进去了,但是缓存没满,不会阻塞。

l 读阻塞

Read函数读够想要的数据个数之前,会处于阻塞状态。

Ø int read():只要输入流中有一个字节,就算足够.

Ø int read(byte[]buff):只要输入流中的字节数目与参数buff数组的长度相同,就算足够。经测试这个确实有!但并不是总是这样的!当我flush一组数据进去的时候,他总会结束阻塞,不管满足条件与否。经测试后发现,只要flush的数据,或者是发送端缓存满数据时,发出的数据,都会被read反常接收。

Ø String readLine():只要输入流中有一行字符串,就算足够.值得注意的是,字节流没有readLine()方法,在BufferedReader类中才有此方法。 

接收端Read函数是不会返回-1的,只要没数据,他就会一直阻塞。

所以对于文件传输的话,自己想办法解决如何暂停吧,比如传送数据大小,比如设置EOF。对于文本传输,可以使用readline函数读取“\n”的方式获取-1。

网络问题中的超时问题:

l 连接超时

connect(SocketAddress endpoint, int timeout)建立连接时设置。

l 读超时

setSoTimeout(int timeout),读超时设置。从某一次read开始,如果到了timeout时间还在阻塞,那么超时!

l 写超时

没有提供方法

socket的端口号

实际运行中的端口号并非启动时的端口号,而是连接成功后系统自动分配的。所以表面上一个端口上的serversocket可以accept多个socket,并返回代表服务器端的socket,实际上是依靠系统重新自动分配端口实现的。

UDP

使用邮递包的方式进行通信,并非使用创建流。

DatagramSocket UDPscoket对象。

DatagramPacket数据包对象。

------------------------------------------------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/u011433762/article/details/80247311
今日推荐