2012-02-18 7 views
2

我正在从缓冲区读取字符串并将其写入服务器。我遇到的问题是,当我将套接字打开并写入一个循环时,服务器永远不会收到字符串。 当我使用这个:使用writeBytes的Java客户端套接字

try {  
     Socket send = new Socket("localhost", 1490); 
     DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
     String message = null; 
     while ((message = buffer.get()) != null){ 
      out.writeBytes(message); 
     } 
     out.close(); 
     send.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

服务器没有收到字符串,但我这样做,当它正常工作:

try {  

     String message = null; 
     while ((message = buffer.get()) != null){ 
      Socket send = new Socket("localhost", 1490); 
      DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
        out.writeBytes(message); 
      out.close(); 
      send.close(); 
     } 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

很显然,我不想保持开启和关闭套接字,但。问题是什么?

回答

0

即使关闭它,数据仍未写入套接字? (在你的第一个片段是)

另外,你有没有尝试使用冲洗方法?你可以阅读在这里:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#flush()和你的代码如下:

try {  
    Socket send = new Socket("localhost", 1490); 
    DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
    String message = null; 
    while ((message = buffer.get()) != null){ 
     out.writeBytes(message); 
     out.flush(); 
    } 
    out.close(); 
    send.close(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 
+0

是的,我没有尝试刷新,我仍然有同样的问题。缓冲区总是有字符串,所以我不认为套接字实际上是关闭的。但为什么我的信息仍然没有收到? – user1190650 2012-02-18 14:34:37

1

你必须要发送一个数据包每次刷新你的插座。 关闭套接字会强制自动刷新,并解释为什么您的数据在套接字关闭时发送。

0

让我猜一猜。

buffer.get()方法是否阻止?如果是这样,那么问题是out.writeBytes(message)不能保证将整个字节表示推送到服务器。代替。您的客户端很可能已经缓冲了等待刷新到服务器的字节。

如果这是怎么回事,那么在每次调用writeBytes后调用flush会解决问题。

但是如果buffer.get()方法没有阻塞,那么调用flush将没有任何区别。事实上,它只会增加网络流量。因此添加冲洗“以防万一”是一个坏主意。


另一种可能性是服务器端代码有问题。

+0

谢谢。是的,buffer.get()确实阻塞了,但是我在每次writeBytes调用之后尝试刷新缓冲区,但仍然遇到同样的问题。任何其他想法? – user1190650 2012-02-18 14:53:44

+0

请再次阅读我答案的最后一句。 – 2012-02-19 11:56:09