0

さて、私は楽しみのためにこのチャットをプログラミングしていて、途中で何かに出くわしました。ソケットが苦手ですが、誰かがソケットの接続を手伝ってくれませんか?

Client.java:

try {
    Socket server = new Socket("jakebobjo.com", 1234);
    InputStream in = server.getInputStream();
    OutputStream out = server.getOutputStream();
    PrintWriter pout = new PrintWriter(out, true);

    pout.println(username + ": " + input.getText() + "\n");

    BufferedReader bin = new BufferedReader(new InputStreamReader(in));
    String responce = bin.readLine();

    server.close();         
} catch (IOException ex) {
    System.out.println("Error connection to host.");
} 

Server.java:

try {
    ServerSocket listener = new ServerSocket(1234);
    Socket client = listener.accept();

    InputStream in = client.getInputStream();
    OutputStream out = client.getOutputStream();
    PrintWriter pout = new PrintWriter(out, true);

    pout.println(username + ": " + input.getText() + "\n");

    client.close();         
    listener.close();
} catch (IOException ex) {
    System.out.println("Error connecting to client.");
}

それらがidkをトリガーすると、プログラムはフリーズします。理由:/

4

1 に答える 1

0

両方のファイルで、どちらの側でもメッセージを受け入れずに反対側にメッセージを送信するようにアプリケーションに要求したため、プログラムがフリーズしています。シーケンスは次の2つのいずれかのようになります。

クライアントがメッセージを送信-サーバーがメッセージを受信する

また

サーバーがメッセージを送信します-クライアントがメッセージを受信します

。あなたの場合、DeadLockにつながるシーケンスのいずれにも従わず、アプリケーションがフリーズします。クライアントファイルのステートメントのシーケンスを次のように変更します。

BufferedReader bin = new BufferedReader(new InputStreamReader(in));
String responce = bin.readLine();
pout.println(username + ": " + input.getText() + "\n");

注:
2)最初にサーバー側プログラムを起動してから、クライアント側プログラムを起動します。
1)さらに、サーバー側では、クライアントからのメッセージを受信せずにソケットを閉じました。したがって、クライアントがサーバーからメッセージを受信した後、サーバーにメッセージを送信しようとすると、プログラムは例外のスローを停止します。

于 2013-01-16T08:33:08.580 に答える