-1

簡単なチャットアプリケーションを実装しています。サーバーは複数のクライアントをリッスンする必要があり、サーバーは1つのクライアントによって入力されたデータをこのサーバーに接続されているすべてのクライアントに送信する必要があります。私はこれを次のコードで実装しました。予期せず、java.net.SocketException:ソケットが閉じられました。誰かがこの例外を解決して、すべてのクライアントにデータを送信するためにコードを変更する必要がある場所を教えてもらえますか?

Client.java

 import java.io.*;
 import java.net.*;
 import java.util.*;
 class Client {
    public static void main(String args[]) {
       try {
        InetAddress addr = InetAddress.getByName("172.26.45.132");
        Socket skt = new Socket(addr, 1234);
        PrintWriter out  = new PrintWriter(skt.getOutputStream(),true);
        BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));
        Scanner sc = new Scanner(System.in);
        String msg="";
         while (msg!="exit") {
         msg= sc.next();
         out.println(msg);
         System.out.println("from Server"+br.readLine());
}
     br.close();
out.close();
  }
  catch(Exception e) {
     System.out.print("Whoops! It didn't work!\n");
  }
 }
 }

Server.java

   import java.io.*;
   import java.net.*;
   class Server {
 public static ListenClient clients[] = new ListenClient[3];
public static int clientCount = 0;
 public static void main(String args[]) {
  try {
     ServerSocket srvr = new ServerSocket(1234);
     Socket skt;
     System.out.print("Server has connected!\n");
     while(clientCount < 3){
    skt = srvr.accept();
    clients[clientCount] = new ListenClient(skt,clientCount);
    Thread t = new Thread(clients[clientCount]);
    clientCount++;
    t.start();
     }
  }
  catch(Exception e) {
System.out.println(e);
     System.out.print("Whoops! It didn't work!\n");
  }
    }
 }

   class ListenClient extends Server implements Runnable{
Socket sc;
int id;
ListenClient(Socket sc, int id){
    this.sc=sc;
    this.id = id;
}
public void run(){
    try{
        BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
        String msg="";
        while((msg=br.readLine())!=null)   
          {   
             PrintWriter clientsOut;
           for(int j = 0 ; j<=clientCount-1; j++){
            clientsOut = new PrintWriter(clients[j].sc.getOutputStream(),true);
            clientsOut.println(msg);
            clientsOut.close();
          }
         }
    }
    catch(Exception e){
        System.out.println(e);
    }
}

}

4

1 に答える 1

1

SocketClosedException は、ソケットを閉じてから使用し続けたことを意味します。入力ストリームまたは出力ストリームを閉じると、ソケットと他のストリームが閉じられます。そのため、入力を読み取っているループ内で出力を閉じることは意味がありません。

于 2012-12-31T07:22:43.857 に答える