2011-07-19 6 views
2

私はローカル(Wi-Fi経由)で完璧に動作しているときに、私のドロイド(クライアント)と私のPC(サーバ)のクライアントサーバソケットを作成しようとします。サーバはclientsocket.getOutputStreamを(取得しようとすると、3G以上のILトライは、私はこの例外を取得するとき)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 1は、この溶液を知っていますか? 助けてください:-(

サーバー

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

ほとんどのネットワーク(無線LANや3G)NATを使用しています。NATは、外部への接続を許可しますが、インバウンド(インターネットからデバイスへ)接続を防止します。

あなたのサーバーとデバイスが同じネットワーク上にある場合は、NATゲートウェイを経由していない場合と同じように動作します。

理由:インターネットからデバイスに接続しようとしていることは、ほとんどのネットワークでは機能しません。

+1

ちょっとピーター、お返事ありがとう、私に示唆するものがありますか? – user820688

+1

実際にNATは克服するのが難しいです。 NATトラバーサルのいくつかの形式を試みるかもしれません:http://en.wikipedia.org/wiki/NAT_traversal ほとんどの場合、2者が直接(p2p)接続を確立するのに役立つ別のサーバーサーバーが必要です。 –

+1

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

関連する問題