关于socket的接收堵塞问题
2013-09-30 13:15
162 查看
1. socket通信中服务器和客户端需要互相收发数据,而readLine()这个函数,如果接收到数据没有换行标志,就会一直堵塞在那
因为writer.print()比writer.println()少了换行符,客户端永远收不到一行结束的标志。
用BufferdWriter时也会出现同样问题
需要加一行writer.newLine();在write(msg)之前
2. 在关闭流的时候,会把socket也关闭
比如上面,如果我在flush之后加上writer.close();那么关联这个writer的socke也会关闭,所以流的关闭应在收发都结束之后再关闭。
3. 如果只是接收一行数据
就像上面这样写
如果想接收多行数据,就要用while循环
如果像上面这么写,会堵塞
应该加一个标志符,可以跳出while循环,客户端在发送的数据后加一个end
writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())), true); writer.print(Msg); writer.flush();
因为writer.print()比writer.println()少了换行符,客户端永远收不到一行结束的标志。
用BufferdWriter时也会出现同样问题
writer = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); writer.write(msg); writer.flush();
需要加一行writer.newLine();在write(msg)之前
2. 在关闭流的时候,会把socket也关闭
比如上面,如果我在flush之后加上writer.close();那么关联这个writer的socke也会关闭,所以流的关闭应在收发都结束之后再关闭。
3. 如果只是接收一行数据
reader = new BufferedReader(new InputStreamReader( socket.getInputStream())); String msg = reader.readLine(); return msg;
就像上面这样写
如果想接收多行数据,就要用while循环
StringBufferstrbuf=new StringBuffer(); Stringline=null; while((line=reader.readLine())!=null){ strbuf.append(line+"\n"); } return strbuf.toString();
如果像上面这么写,会堵塞
应该加一个标志符,可以跳出while循环,客户端在发送的数据后加一个end
while((line=reader.readLine())!=null){ if(line.equalsIgnoreCase("end")){ break; } strbuf.append(line+"\n"); }
相关文章推荐
- 关于socket的接收堵塞问题
- 一个关于UDP socket服务端接收长度不正确的问题
- SOS-关于Socket类接收的问题
- 关于linux下的udp/tcp通信设置发送sendto/接收recvfrom信息超时的参数。解决通道堵塞问题。
- 关于udp socket recvfrom函数的一个易错问题: 如果应用程序指定的接收长度不够怎么办?
- 关于Socket IO模式下 read堵塞问题
- 关于小米(红米1s) 接收不到短信广播的问题
- 关于Socket 设置 IPAddress.Any 情况下,出现服务器积极拒绝的问题
- 关于用Foxmail接收Exchange邮件服务器问题
- 关于PHP中Socket连接及读写数据超时的问题
- windows和Linux之间socket传输结构体关于字节对齐产生的问题
- 这是我第一篇文章,想问个关于java客户/服务器Socket的问题。
- 关于判断Socket断开的问题
- 关于NSNotificationCenter接收不到的问题
- RHEL修改最大文件打开数,关于epoll socket Too many open files问题的解决
- 关于HTML页面接收前页面传值,并将值传给下一个页面的问题
- QT 3G SOCKET发送接收问题
- 关于socket编程中服务器端如何检测客户端连接断开的问题
- 关于ActiveMQ消息接收的问题
- 关于android&java在socket通讯单字节大于127的问题