Javaで標準のマルチクライアント/サーバプログラムを作成しています。サーバーは接続を受け入れ、それぞれを処理する新しいスレッドを生成します。また、クライアントは、サーバーからのメッセージを待機するスレッドを生成します。クライアントとサーバーは、MessageInputStreamとObjectOutputStreamを介してMessageオブジェクトを渡すことによって通信します。Javaクライアント/サーバがソケット経由でオブジェクトを送信する問題
初期のハンドシェイクは正常に機能します。クライアントが起動すると、サーバーへのソケット接続が開始されます。サーバーはソケットを受け取り、接続に成功したことを示すメッセージをクライアントに送信します。クライアントはそのユーザ名を送り返し、クライアントとサーバの両方がメッセージを待つことになります。
私はチャットメッセージを作成してサーバーに送信するテキストをクライアントから送信します。サーバーはこのメッセージを受信し、接続されているすべてのクライアントに送信しようとします(1つしかありません)。問題は、このメッセージが決してクライアントに戻らないということです。
// This is Message.send
public void send(ObjectOutputStream stream) throws IOException{
stream.writeObject(this);
}
// ClientThread.run
public void run(){
try {
out = client.getOutputStream();
out.flush();
ObjectInputStream in = client.getInputStream();
Message msg = null;
int len;
byte[] bytes = null;
int i = 0;
// Continuously read new Messages from the server
while(true){
msg = (Message)in.readObject();
processInput(msg);
}
} catch (Exception e) {
Util.showError(e.getMessage(), "Connection Error");
}
System.out.println("Client exited");
}
// ServerThread.run
public void run() {
try {
out = new ObjectOutputStream(client.getOutputStream());
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
Message msg = null;
while(client.isConnected()){
msg = (Message)in.readObject();
processInput(msg);
}
in.close();
client.close();
} catch (Exception e) {
server.addMessage(e.getMessage());
}
}
Um、これをスローする代わりにSOAPまたはRESTを使用することを検討してください。 – bmargulies
これは練習ですので、既存のプロトコルを使用せずに、より低いレベルのソケットで練習することができます。 – Jared