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

标签 java android sockets tcpsocket

如何从具有两个不同线程的单个套接字下载具有两个不同对象 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/

相关文章:

java - 如何以 Java 8 方式获取特定 URL 上的文本行流?

java - 音频流 - 捕获和读取麦克风数据

java - 检查SQLite中的列是否为NULL

javascript - 使用自定义路由而不是蓝图的 SailsJs websocket?

java - 套接字传输文件

java - 如何查找任意网页/HTML页面对应的JSP文件?

java - 使用 JSch 打开 SSH channel 时出现 "session is down"错误

android - 如何在 android 上使用 ffmpeg 创建播放器?

java - 使用 Gson 将 JSON 转换为 Java 对象

C++ iptables 重定向形成单独的数据包