2017-11-06 1 views
0

私はサーバとクライアントを でマルチスレッドのハングマンゲームを作成する必要があります。私はゲーム(Hangman)を作るクラスとtryクラスのcatchメソッドのmainメソッドを持つServerクラスを作成することを考えています。クライアントクラスには、ポートに接続して再生できるクライアントがあります。オブジェクトをJavaのクライアントとして使用する

私の質問は、私のハングマンゲームでクライアントを作成し、別のプログラムではなくオブジェクトとしてサーバーにリクエストを送信するにはどうすればいいですか? ありがとうございます!

+0

どのようにアプリケーションを送信する予定ですか? – Stultuske

+1

「オブジェクトとして、別のプログラムではない」とはどういう意味ですか? – EJP

+0

@EJP質問タイトルで判断すると、私は彼がサーバー側でのみプログラムを実行したいと思うし、他の人はサーバー側のプログラムを使ってリモートコンピュータ上のクライアントソケットを開く。 (これは不可能です) –

答えて

0

Javaでは、Socketsと呼ばれるオブジェクトを使用して、ネットワーク経由で特定のIPおよびポートにデータを送信できます。そのデータは、ポートでリッスンしているServerSocketによって受信されます。リモート接続を受け入れ、呼び出しが答えられるようになります

ソケットがサーバーソケットに接続すると、あなたがServerSocket#acceptを起動するまで、それはすべての発信コールをキューイングし、 (任意の呼び出しがキューに入れられる前に、あなたがacceptを起動する場合、それは意志返される前にリクエストを待つ)。 acceptメソッドは、データを送受信するための入力ストリームと出力ストリームの両方を持つ通常のソケットオブジェクトを返します。

注:複数のソケットが同時に通話をキューに入れることができ、あなたが を呼び出すaccept()たびに、サーバーが保留中のソケットを受け入れます。 acceptメソッドは、Scannernext()メソッドのように多く動作します。 が混乱していますが、詳細はこちら ServerSocket listens without accept()です。

私は、クライアント・ソケットの出力ストリームから(acceptから入手した)サーバソケットの入力ストリームからObejctInputStreamを構築し、ObjectOutputStreamお勧めします。

受信データを送信するために、両方のソケットが必要な場合は、単にサーバ側でObjectOutputStream、およびクライアント側のObjectInputStreamを作成します。あなたは(あなたの割り当てはマルチスレッドなので、Runnableが最良の選択肢である)の両方のストリームをリッスンするループ、またはRunnableのいくつかのタイプを使用する必要があります。

典型的には、1つのこのと同様に、クライアントソケットに近づくだろう:あなたがソケットの使用を終了するときshutdownメソッドを呼び出すことが重要である

public class ObjectSocket{ 

private Socket socket; 
private ObjectOutputStream streamOut; 
private ObjectInputStream streamIn; 

public ObjectSocket(String IP, int port) throws UnknownHostException, IOException { 
    //Request connection. 
    this.socket = new Socket(InetAddress.getByName(IP), port); 
} 
public void sendObject(Object obj) throws IOException { 
    if(this.streamOut == null) this.streamOut = new ObjectOutputStream(this.socket.getOutputStream()); 

    //Make sure the connection is still there and the socket is still open. 
    if(this.socket.isConnected() && !this.socket.isClosed()) 
     //Send it! 
     this.streamOut.writeObject(obj); 
} 

public Object recieveObject() throws IOException, ClassNotFoundException { 
    if(this.streamIn == null) this.streamIn = new ObjectInputStream(this.socket.getInputStream()); 

    //Cast appropriately. 
    return this.streamIn.readObject(); 
} 
public void shutdown() throws IOException { 
    //End the connection 
    this.socket.close(); 
} 
} 

。ポートを開いたままにすることは危険です。

サーバ側のソケットは、ほぼ同じように近づいています

public class ServerObjectSocket { 

private ServerSocket servSocket; 
private Socket socket; 
private ObjectOutputStream streamOut; 
private ObjectInputStream streamIn; 

public ServerObjectSocket(int port) throws IOException { 
    //Listen on this port : 0 will listen on a random port. 
    this.servSocket = new ServerSocket(port); 
} 
public void acceptConnectionRequest() throws IOException { 
    //Connect with any client socket that is trying this port 
    this.socket = servSocket.accept(); 
} 
public Object recieveObject() throws IOException, ClassNotFoundException { 
    if(this.streamIn == null) this.streamIn = new ObjectInputStream(this.socket.getInputStream()); 

    //Cast appropriately. 
    return this.streamIn.readObject(); 
} 
public void sendObject(Object obj) throws IOException { 
    if(this.streamOut == null) this.streamOut = new ObjectOutputStream(this.socket.getOutputStream()); 

    //Make sure the connection is still there and the socket is still open. 
    if(this.socket.isConnected() && !this.socket.isClosed()) 
     //Send it! 
     this.streamOut.writeObject(obj); 
} 
public void shutdown() throws IOException { 
    //Close the port and end the connection : never leave a port open. 
    this.servSocket.close(); 
} 
} 

は、異なるネットワーク上のソケットとの間の接続をする場合、転送ポートで実行中のサーバソケットのみ可能で、覚えておいてください。 LAN上で実行されているソケットはこの問題に直面しませんが、ファイアウォールに問題がある可能性があります。

あなたがよりよく理解や例が必要な場合は、単にJavaのソケットのチュートリアルのためのインターネットを検索。ウェブの周りに浮かんでいる便利なチュートリアルがたくさんあります。見つけにくいものではありません。

+0

データは 'ServerSocket'によって受信されません。 'Socket.isConnected()'は、あなたがそれをテストしているどのポイントでもfalseになることはできません。 'checkInput()'メソッドは間違ったストリームをチェックし、 'available()'のチェックは一般的に無意味です。入力ストリームまたはソケットを閉じる必要はありません。受け入れられたソケットはインスタンスメンバーであってはなりません。非常に品質の低いコード。 – EJP

+0

そして、 'accept()'によって接続が確立されていません。それが呼び出される前に存在する可能性があります。 – EJP

+0

'データは 'ServerSocket'によって受信されませんが、これがどういうものかわかりません。開いているサーバーソケットを持つポートにデータを送信すると、毎回データが受信されます。あなたの応答のための –

関連する問題