【问题标题】:Same TCP Socket (client-side) with two different scanners and two different BufferedReader具有两个不同扫描器和两个不同 BufferedReader 的相同 TCP 套接字(客户端)
【发布时间】:2015-09-22 20:42:59
【问题描述】:

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

【问题讨论】:

  • 你好,这里的Android是什么关系?
  • 如果你想多线程你的 I/O 你将需要使用像 ServerSocket 和调用 accept() 来返回一个新的 Socket。一个 Socket 只能由一个线程管理,但一个线程可以管理多个 Socket。这个想法是,对于每个新连接,都会创建一个新套接字,但该套接字仅由单个线程管理。

标签: java android sockets tcpsocket


【解决方案1】:

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

你不能。

你永远不会让它工作。由于您无法控制的 TCP 方面,数据将以不可预知的数量到达,BufferedReaders 将以不可预知的方式从对方那里窃取数据。如果有内部缓冲,Scanners 自己也一样。

在任何情况下,您尝试做的事情都没有实际意义。您期望两个线程执行单个线程不会执行的操作?例如,如果您希望他们交替阅读,他们不会。如果您希望能够自信地发送一个用于线程 1 的字符串和另一个用于线程 2 的字符串,那么您不能。这是不可能的。

我已经在下面尝试过这个解决方案,但是 myReader1 在从 Socket 读取后出现无效字符,我该如何解决?您可能会建议一种解决方法?

您不会成功地按照您开始的路线进行任何工作,但任何解决方案的基础都必须是单个Scanner 和单个BufferedReader 每个套接字。如果必须有两个线程,则需要两个套接字,每个套接字有一个 BufferedReaderScanner

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2012-09-22
    • 2012-06-23
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多