2016-05-29 17 views
0

以前にサーバーに接続されたクライアントを介してサーバーがTCP接続を開く方法を教えてください。以下のコード例のようなシンプルなサーバーがあるとしましょう。サーバはクライアント接続を待機し、ハンドラスレッドは接続されたクライアントを処理します。以下のように、サーバーで操作を行うたびに、接続を再確立し、サーバーと通信して接続を閉じます。したがって、サーバーがクライアントからサーバーへのTCP接続を開こうとしている場合(クライアントからサーバーへのアクティブな接続がない場合)、どのように行うことができますか?サーバーからクライアントへのJava TCP接続

Serverコード

public class DServer { 
    public static void main(String[] args) { 
     ServerSocket serverSocket = new ServerSocket(7800); 
     while(true) { 
      Socket socket = serverSocket.accept(); 
      System.out.println("Server established a new connection"); 
      HandleConnection handler = new HandleConnection(socket); 
      handler.start(); 
     } 
    } 
} 

クライアントコード

public class DClient{ 
    public static void main(String[] args) { 
     Socket socket = new Socket("localhost", 7800); 
     ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); 
     ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 

     //for every operation you do, first reestablish the connection, 
     //communicate with server, then close the connection. 

    } 
} 

答えて

1

私はあなたがクライアントであり、どのようなサーバーのネットワーク意味であるかについて、いくつかの根本的な誤解があると思います。

サーバーは接続をリスンするアプリケーションです。クライアントは、サーバーへの接続を作成するアプリケーションです。両方のアプリケーションが自由に通信を開始できるようにするには、アプリケーションをクライアントとサーバーの両方にする必要があります。

"DClient"アプリケーションにはServerSocketが必要です。 "DCerient"アプリケーションは、 "DServer"が接続を作成したいときにホストとポートの "DServer"アプリケーションに通知することができます(NATingのようなものは、両方のアプリケーションが同じネットワークになければ)。

また、使用状況に応じて、クライアントからサーバーへの接続を開いたままにすることもできます。これは、サーバーがデータをプッシュできるようにするより一般的なアプローチです。

+0

説明のためにありがとう。私はクライアントとサーバーのパラダイムを誤解していませんでしたが、私はそれをそのように実装するよう求めている宿題に関する質問をしています。私はあなたが言ったようにクライアント上のサーバーソケットを開かなければなりませんでしたが、それは私には(多くのクライアントがいる場合)不自然に思え、それを実際に行う別の方法があるかどうかを理解したいと思っていました。 – user3717434

0

両方のクライアント要求に対してミドルウェアを呼び出した要求クライアントとサーバーの両方を管理するプロキシサーバーを作成するソリューションがあります。 ネットワークプログラミングでは、クライアントサーバーアーキテクチャのために、サーバーの起動とクライアントの要求を守る必要があります。

+0

しかし、すでにそのためのJavaライブラリがありますか?私はプロキシサーバーを作成することを意味します。 – user3717434

関連する問題