2

ユーザー名を入力して接続ボタンを押すと、次のようになります。

public connect{...
sock = new Socket("77.70.65.222", 5000);
InputStreamReader streamreader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(streamreader);
writer = new PrintWriter(sock.getOutputStream());
Thread IncomingReader = new Thread(new IncomingReader());
IncomingReader.start();
writer.println("``connecto"); 
//sends message to server, which sends back a message ,which when read by my 
//IncomingReader class(implements Runnable) prints online users in "onlineUsersArea"
writer.flush();
String[] a = onlineUsersArea.getText().split("\n");
for(String s:a){if(s.equals(username)) throw new Exception();}
//throws an exception if the selected username exists
writer.println(username + "`has connected.`Connect"); // Displays to everyone that user connected.
writer.flush(); // flushes the buffer
...}

IncomingReader問題は、メソッドがオンラインユーザーを印刷するのを待たずa[]、メソッドが終了する前に何も含まれていないことです。IncomingReaderを待ってから続行するにはどうwriter.flush(); すればよいですか。を追加するIncomingReader.join();と、接続ボタンを押した後、クライアントが応答を停止します。
ユーザーがすでに使用されているユーザー名を使用できないようにする別の方法があれば、それを聞いて非常にうれしく思います。前もって感謝します!

4

1 に答える 1

1

これは単なる試みですが、別のスレッドでライターを実行するとどうなりますか?問題は、他のスレッドがジョブを終了するのを待っている間にメインスレッドがブロックされていることだと思います。

(ヒント:私Exceptionがあなたなら、単純な-sをスローすることは使用しません。新しいタイプを定義し、Exception必要に応じてそのタイプだけを処理します。)

于 2012-12-02T19:33:22.543 に答える