2016-08-31 135 views
-1

我正在学习使用Android进行套接字编程。我有两个移动设备。两者都连接到不同的WiFi网络。我的服务器应用正在一台设备上运行,而客户端应用正在另一台设备上运行。我无法将客户端连接到具有不同WiFi网络的服务器。为什么?
请帮助我,并为我糟糕的沟通感到抱歉。我无法将套接字客户端连接到不同WiFi网络上的套接字服务器

客户端代码:

class ClientSideThread extends Thread { 

    String response; 

    @Override 
    public void run() { 

     try { 
      socket = new Socket("192.168.1.111",8085); 

      OutputStream outToServer = socket.getOutputStream(); 
      DataOutputStream out = new DataOutputStream(outToServer); 
      out.writeUTF("hi"); 
      InputStream inFromServer = socket.getInputStream(); 

      DataInputStream in = new DataInputStream(inFromServer); 

      response = in.readUTF(); 

      out.close(); 
      in.close(); 
      socket.close();     

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      response = "UnknownHostException: " + e.toString(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      response = "IOException: " + e.toString(); 
     } 
    } 
} 

Server代码:

private class SocketServerThread extends Thread { 
    @Override 
    public void run() { 
     try { 
      serverSocket = new ServerSocket(socketServerPORT); 

      while (true) { 
       Socket socket = serverSocket.accept(); 
       sIpAddress = socket.getInetAddress(); 
       sPort = socket.getPort(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       String line; 
       StringBuilder sb = new StringBuilder(); 
       if ((line = reader.readLine()) != null) { 
        sb.append(line); 
       } 
       message = sb.toString(); 
       printWriter = new PrintWriter(socket.getOutputStream()); 
       printWriter.println(message); 
       printWriter.flush(); 

       MainActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         String sDisplayMsg = "Replay:" + message; 
         TextView rowTextView = new TextView(MainActivity.this); 
         rowTextView.setText(sDisplayMsg); 
         linearLayout.addView(rowTextView); 
        } 
       }); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

检查服务器是否在端口上侦听,您的客户端是否发送连接请求? –

+0

是的,我检查了,我得到客户端代码中的Socket超时异常 – Siddharthan

+0

当客户端无法写入输出流时,可能会发生这种情况。在服务器端硬编码端口号8085而不是socketServerPORT。 –

回答

0

您提它们是两个不同的WiFi网络。我怀疑这两个网络没有连接。

甚至在您尝试使用Andriod之前,请检查服务器设备IP地址是否可从客户端网络访问。您可以将笔记本电脑或桌面连接到客户端网络,并发出ping命令ping 192.168.1.111以查看目标IP是否可访问。如果可以,请执行telnet 192.168.1.111 8085。如果telnet没有连接并且ping可达,那么服务器套接字就不会绑定到端口8085.如果ping本身不可达,那么这两个路由器可能不会互连。有可能在服务器设备上禁用ping。您可以发出tracert 192.168.1.111以查看网络数据包走多远。查找目标服务器的网关IP。如果没有找到,2路由器可能没有链接,你需要链接它们。

+0

感谢replay.i尝试,但我无法访问服务器的IP地址。我得到这个error.why?ping 192.168.1.118 32字节的数据: 请求超时。 请求超时。 请求超时。 请求超时。 ping 192.168.1.118的统计数据: 数据包:发送数= 4,收到数= 0,丢失数= 4(100%丢失数), – Siddharthan

+0

正如我猜测的那样,这两个网络没有互相连接。只需确认,请尝试'tracert'和'teltnet'。如果两个WiFi路由器都在您的控制之下并且位于相同的位置,则可以使用物理网络电缆连接这两个WiFi路由器,并将它们配置为将数据包从一个转发到另一个。你需要懂得网络的人来帮助你做到这一点。 您的代码从快速检查中看起来很好。 –

+0

从大多数应用程序的架构角度来看,我期望服务器是一个运行在服务器上的独立应用程序,具有可通过互联网访问的静态IP,以便任何设备都可以访问它。为服务器编写独立的Java应用程序可能会更好。你的代码不会改变你写的Android代码。 –

相关问题