相同的TCP套接字(客户端)具有两个不同的扫描器和两个不同的BufferedReader

时间:2015-09-22 20:42:59

标签: java android sockets tcpsocket

如何从具有两个不同线程的单个套接字下载具有两个不同对象的字符串BufferedReader和两个不同的对象Scanner? 我已经尝试过这个解决方案,但是从Socket读取后,myReader1是无效字符,我该如何解决?你可能会建议一个解决方法?非常感谢提前

grep -oP '"\K[^"]*(?="/)' file | paste -d / - -

1 个答案:

答案 0 :(得分:1)

  

如何从具有两个不同线程的单个套接字下载具有两个不同对象BufferedReader和两个不同对象Scanner的字符串?

你不能。

你永远不会让它发挥作用。由于您无法控制TCP的各个方面,数据将以不可预测的量进入,BufferedReaders将以不可预测的方式相互窃取。如果他们有内部缓冲,则同意Scanners

无论如何,你要做的事情没有实际意义。你期望两个线程能够做到这一点,一个线程赢了吗?例如,如果你期望他们交替阅读,他们就不会。如果您希望能够自信地发送一个用于线程1的字符串和另一个用于线程2的字符串,那么您就无法做到。这是不可能的。

  

我已经尝试过这个解决方案,但是从Socket读取后,myReader1是无效字符,我该如何修复?您可以建议一种解决方法吗?

您未能成功完成任何工作,但任何解决方案的基础必须是单ScannerBufferedReader {}}每个插座。如果您必须有两个线程,则需要两个套接字,每个套接字都有BufferedReaderScanner

try
{
    Socket mySocket  = new Socket(serverAddr, PORT);
}
catch(Exception e)
{
      e.printStackTrace();
}

不要写这样的代码。首先,您应该只捕获IOException.其次,依赖于此代码成功的所有代码应该在逻辑上位于此try块中。除非此代码成功,否则任何地方的任何代码都不可能访问mySocket变量。

while(mySocket.isConnected() && myScanner1.hasNext())

isConnected()测试在这里毫无意义。它永远不会返回虚假。当对等方断开连接时,它并没有神奇地变成虚假。