如何从具有两个不同线程的单个套接字下载具有两个不同对象 BufferedReader 和两个不同对象 Scanner 的字符串? 我已经在下面尝试过这个解决方案,但是 myReader1 在从 Socket 读取后包含无效字符,我该如何解决?你可能会建议一个解决方法?提前致谢
//Socket TCP declaration
InetAddress serverAddr = InetAddress.getByName(IP);
try
{
Socket mySocket = new Socket(serverAddr, PORT);
}
catch(Exception e)
{
e.printStackTrace();
}
//Thread 1
Thread t1 = new Thread(new Runnable()
{
@Override
public void run()
{
BufferedReader myReader1 = new BufferedReader(new InputStreamReader(mySocket.getInputStream(), "UTF-8"));
Scanner myScanner1 = new Scanner(myReader1).useDelimiter("\0");
synchronized(mySocket)
{
while(mySocket.isConnected() && myScanner1.hasNext())
{
String s = myScanner1.next();
}
}
}
});
Thread t2 = new Thread(new Runnable()
{
@Override
public void run()
{
BufferedReader myReader2 = new BufferedReader(new InputStreamReader(mySocket.getInputStream(), "UTF-8"));
Scanner myScanner2 = new Scanner(myReader2).useDelimiter("\0");
synchronized(mySocket)
{
while(mySocket.isConnected() && myScanner2.hasNext())
{
String s = myScanner2.next();
}
}
}
});
t1.start();
t2.start();
最佳答案
how can I download strings with two different objects BufferedReader and two different objects Scanner from a single socket with two different threads?
你不能。
你永远不会让它工作。由于 TCP 的某些方面您无法控制,数据将以不可预测的量到达,并且 BufferedReaders
将以不可预测的方式从彼此那里窃取数据。如果 Scanners
具有内部缓冲,则它们本身也是如此。
在任何情况下,您尝试做的事情都没有实际意义。您期望两个线程做什么而单个线程不会?例如,如果您希望他们交替阅读,他们不会。如果您希望能够自信地发送一个用于线程 1 的字符串和另一个用于线程 2 的字符串,那么您做不到。这是不可能的。
I already tried this solution below but myReader1, after reading from Socket, is with invalid characters how can I fix? You might suggest a workaround?
按照您已经开始的路线,您不会成功地让任何东西正常工作,但任何解决方案的基础都必须是单个 Scanner
和单个 BufferedReader
每个套接字。如果你必须有两个线程,你将需要两个套接字,每个套接字都有一个 BufferedReader
和一个 Scanner
。
try
{
Socket mySocket = new Socket(serverAddr, PORT);
}
catch(Exception e)
{
e.printStackTrace();
}
不要这样写代码。首先,您应该只捕获 IOException。
其次,所有依赖于此代码成功的代码都应该在逻辑上位于此 try block 内。除非此代码成功,否则任何地方的任何代码都不可能访问 mySocket
变量。
while(mySocket.isConnected() && myScanner1.hasNext())
isConnected()
测试在这里毫无意义。它永远不会返回 false。当对等方断开连接时,它不会神奇地变为 false。
关于java - 具有两个不同扫描仪和两个不同 BufferedReader 的相同 TCP 套接字(客户端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32726527/