2017-06-13 8 views
1

ソケット(TCP)ごとにサーバーと通信するAndorid Appを実装しました。 Androidアプリでボタンをクリックすると、アプリとサーバー側の間で通信が確立されているだけでなく、メッセージが交換されています。 もう一度サーバーと通信するには、Eclipseでサーバーをもう一度実行する必要があります。私は一度サーバー側を実行したいと思います。クライアントのソケットバッファにデータがない場合、Androidユーザーが新しい要求を に送信するとサーバーは再びリッスンする必要があります。私はRunnableクラスを使用してそれを管理しようとしましたが、再びEclipseのサーバー側ですか?どうすればそれを稼働させることができますか?クライアントにリッスンするServerSocketを維持する

public class Server{ 

    public static void main(String args[]) throws Exception { 
     Cg2AapiServer.startServer(); 

    } 

    private static void startServer() { 

     Runnable serverTask = new Runnable() { 

      @Override 
      public void run() { 
       try { 

        ServerSocket serverSocket = new ServerSocket(27015); 
        Socket clientSocket = serverSocket.accept(); 

        Cg2AapiServer.bufferedInputStream = new BufferedInputStream(clientSocket.getInputStream()); 
        Cg2AapiServer.outputStream = clientSocket.getOutputStream(); 
        Cg2AapiServer.smartCard = new SmartCard(); 
        Cg2AapiServer.handleConnection(); 

        Cg2AapiServer.bufferedInputStream.close(); 
        Cg2AapiServer.outputStream.close(); 
        clientSocket.close(); 
       } catch (IOException e) { 
        System.err.println("Unable to process client request"); 
        e.printStackTrace(); 
       } 
      } 
     }; 
     Thread serverThread = new Thread(serverTask); 
     serverThread.start(); 

     System.out.println("At the end of the startServer method!"); 

    } 


    private static void handleConnection() throws IOException { 
     ByteBuffer receiveBuffer = ByteBuffer.allocate(Cg2AapiServer.RECEIVE_BUFFER_LENGTH); 
     int readBytes = 0; 
     while (true) { 
      readBytes = Cg2AapiServer.bufferedInputStream.read(receiveBuffer.array(), receiveBuffer.position(), 
        receiveBuffer.remaining()); 
      System.out.println("readBytes: " + readBytes); 
      if (readBytes < 0) { 
          // What should I do here when the readBytes = -1 
       Cg2AapiServer.startServer(); //With this line I am getting the error below. 
       break; 
      } 
     } 

} 

エラー

クライアント要求java.net.BindExceptionを処理できません:使用中のすでに住所 : のjavaで java.net.DualStackPlainSocketImpl.bind0(ネイティブメソッド)でJVM_Bind .Net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) at java.net.PlainSocketImpl.bind(PlainSoc (ServerSocket.java:190)を java.net.ServerSocket.bind(ServerSocket.java:376) java.net.ServerSocket(ServerSocket.java:237) java.net.ServerSocket(ServerSocket.java: 128) Cg2AapiServer $ 1.runで( java.lang.Thread.run(Thread.java:745)

+0

住所:JVM_Bind。古いサーバーを停止してから実行する必要があります。このエラーは、選択したポート番号で既にリッスンしているものがあることを意味します。 – Sneh

答えて

0

でCg2AapiServer.java:42)が再びサーバと通信するために私が実行する必要がEclipseのサーバーを再起動します。

いいえ。しかし、コードを非常にひどく書いてしまうと、オプションがなくなる可能性があります。

どのように動作させることができますか?

あなたはそれが非常に簡単にJavaソケットを使用して、クライアント・サーバ間の通信を設定する方法を示して偉大interwebzにそこに存在するサンプルの無数のいずれかを、以下で動作するように取得することができます。

実際には、Javaソケットの完全な動作サンプルコードを含む他の偶発的な問題(ファイアウォールのために通信できないなど)に関するスタックオーバーフローに関する疑問が存在します。例えば、この1:

のStackOverflow:すでに使用中のSimple Java Client/Server Program

関連する問題