我正在努力让我的服务器更稳定。它使用服务器套接字和套接字类。信息的传输是使用流类完成的。
我注意到有时候调试会在一段时间内释放每一盎司。
我发现id我的客户端刚刚进行套接字连接并且没有发送过数据,或者服务器期望服务器会冻结类InputStream的read方法。
有没有办法让read方法超时?该文件没有谈及时间噘嘴,但确实说它会阻止信息数据和蔼可亲。
如果读取不能超时,是否有另一种方法通过套接字连接读取数据,如果客户端不再发送数据则不冻结????
数据读取的代码段以及冻结的位置
public String ReadLine(){
String out="";
// read in one line
try{
request = new StringBuffer(1000);
boolean f=true;
while(true){
int c=in.read(); // WILL FREEZ HEAR IF CLIENT NO LONGER CONNECTED OR SENDING DATA
if (c=='\r'){
// next should be a \n
c=in.read();
//.....
答案 0 :(得分:0)
请发布您的完整代码,但如果您使用的是InputStream,则它是一种阻止I / O方法,只要您的客户端连接到它,它就会“冻结”。如果删除客户端连接,则应释放该块。您应该创建一个单独的线程来处理I / O,而不是对此自己有所了解。此外,真正的问题应该是,为什么客户端不发送消息?
答案 1 :(得分:0)
你能试试......
int c = 0;
while((c = in.read()) != -1) {
...
}
并查看它是否解决了问题。
答案 2 :(得分:0)
如果使用套接字,则需要在套接字上设置SO_TIMEOUT值。这将允许读取超时并抛出InterruptedIOException
。
Socket.setSoTimeout
是要查看的方法。请注意,超时是在套接字本身上设置的,而不是在从套接字获得的输入流上设置的。