2011-07-19 77 views
2

我試圖創建一個客戶端服務器套接字beetwen我的機器人(客戶端)和我的電腦(服務器),當我在本地(通過WiFi)它完美的工作,但當IL嘗試通過3G我得到這個例外,當服務器試圖讓clientsocket.getOutputStream()Android客戶端,Pc服務器套接字工作超過3g

at java.lang.Thread.run(Unknown Source) 
java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(Unknown Source) 
at java.net.SocketInputStream.read(Unknown Source) 
at java.io.DataInputStream.readUnsignedShort(Unknown Source) 
at java.io.DataInputStream.readUTF(Unknown Source) 
at java.io.DataInputStream.readUTF(Unknown Source) 

什麼的probleme,做一個ENY知道這該如何解決? 幫助,請:-(

服務器

public class Server { 

ServerSocket serverSocket; 
public LinkedBlockingQueue<CDRecCourseDisplay> recCours; 
public LinkedList<ClientMail> clientMails; 
static Server server; 

public static Server getInstance(){ 
    if(server == null){ 
     server = new Server(); 
    } 
    return server; 
} 

Server() { 
    // TODO Auto-generated constructor stub 
    try { 
     serverSocket = new ServerSocket(54444); 
     recCours = new LinkedBlockingQueue<CDRecCourseDisplay>(10); 
     clientMails = new LinkedList<ClientMail>(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    this.start(); 
} 

private void start(){ 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while (true){ 
       try { 
        Socket socket = serverSocket.accept(); 
        new Thread(new Client(socket)).start(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     } 
    }).start(); 
} 

class Client implements Runnable{ 

    Socket socket; 
    DataInputStream in; 
    DataOutputStream out; 

    public Client(Socket socket) { 
     // TODO Auto-generated constructor stub 
     this.socket = socket; 
     if(socket == null) return; 
     try { 
      InputStream i = socket.getInputStream(); 
      OutputStream o = socket.getOutputStream(); 
      in = new DataInputStream(i); 
      out = new DataOutputStream(o); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       while(true){ 
        try { 
         out.writeUTF("Test Message"); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 

     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       while(true){ 
        try { 
         String buf = in.readUTF(); 
         Log.d("MESSAGE", buf); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 
    } 

} 

}

和客戶

class Client implements Runnable{ 

    Socket socket; 
    DataInputStream in; 
    DataOutputStream out; 

    public void run() { 
     // TODO Auto-generated method stub 
     boolean conected = false; 
     while(!conected){ 
      try { 
       Thread.sleep(500); 
       socket = new Socket("213.233.216.25", 54444); 
       in = new DataInputStream(socket.getInputStream()); 
       out = new DataOutputStream(socket.getOutputStream()); 
       conected = true; 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       Log.e("ERROR :", e.getMessage()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       Log.e("ERROR :", e.getMessage()); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       Log.e("ERROR :", e.getMessage()); 
      } 
     } 

     new Thread(new Runnable() { 

      public void run() { 
       // TODO Auto-generated method stub 
       while(true){ 
        try { 
         String buf = in.readUTF(); 
         log.d("MESSAGE", buf); 
         } 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 


     new Thread(new Runnable() { 

      public void run() { 
       // TODO Auto-generated method stub 
       while(true){ 
        try { 
         out.writeUTF("Test message from the phone"); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 
    } 
} 
+2

添加您的代碼。這可能是一個防火牆問題? – sealz

回答

2

大多數網絡(WiFi和3G)使用NAT。NAT允許出站連接,但防止入站(互聯網到設備)連接。

當你的服務器和設備都在同一個網絡上時,就像你的情況一樣,那麼當你沒有穿越NAT網關時,它就可以工作。

理由:您試圖做的事(從互聯網到設備的連接)在大多數網絡中都不起作用。

+1

嘿,彼得,謝謝你的迴應,你有什麼建議給我? – user820688

+1

實際上NAT很難克服。您可以嘗試某種形式的NAT遍歷:http://en.wikipedia.org/wiki/NAT_traversal 大多數情況下,它需要您有一個單獨的服務器服務器,以幫助雙方建立直接(p2p)連接。 –

+1

http://stackoverflow.com/questions/917385/nat-traversal-with-java –

相關問題