JAVA阻塞socket
1. java socket 阻塞和非阻塞 会对数据传输有什么影响
阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。 非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 对象的阻塞模式和阻塞函数调用 对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子
2. java socket 服务端接收数据阻塞。
这个首先要排除程序族碰上的逻辑错误,如果减少了压力是否还有这种现象呢?如果程序没有问题简单的办法就是孙弯在服务端校验数据长度,如果长度错误则返兆凯谈回错误代码给客户端要求客户端重新发送消息。有时候网络拥堵,机器的性能也会有影响到结果,需要逐个排除。
3. JAVA socket传送文件一直被阻塞
客户端拆裤不是进入死循环了,而是停在chunkSize = buffile.read(line),这句代码上了,客户端在等待服务器传送数据来;
就跟你服务器接受客户端一个情况:
while(true){
Socket s=ss.accept();
}
此时你的客户端收数据就是这个意思,所以你客旅橡简户端不能写!=-1
服务端往流里写数据!=-1 是正常的读文件判断,应该这样,当满足是,也就是文件读完了,他将不忘客户端发送数据了,而如升客户端一直等等,此时就是我上面说的了,也就是你说的“死循环”
所以应该按照1楼说的 ,服务器!=-1 后,你在写一个比如“结束” 到客户端,客户端while里是 如果接受“结束” 就停止
4. java SOCKET编程 ,如何跳出accept() 阻塞
首先你这个逻辑就有问题
你如果想先将数据发给客户端,那么必须要让客哗银户端先连接到服务端,你才能进行发送对吧
那么你就可以把这个总是细分,第一步,客户端连接到用器乱祥宴,这时候你的服务器才能向客户端发送数据库,第二步客户端处理完服务端的宴猜数据,再次向服务端发送数据
另外,你服务端应该用多线程进行交互
即一发现有客户端连接
就立马启动一条线程来处理请求
5. JAVA socket聊天室程序 readLine()阻塞
对每一个客户端都建立一个线程来接收消息,发消息与接消息不要在同一线程上,那就才能解决阻塞问题。一般新手用socket编程,大都是遇到阻塞问题不懂解决,导致了收发消息失败。其实网上socket聊天通讯的例子大把,遇到问题查查看,思考下就能明白了。
有问题欢迎提问,满意请采纳,thx.