0

クライアントからソケットを受け取り、それらからデータを受信し、受信したデータをすべてのクライアントに送信するTCPサーバーを作成する必要があります。これを行うには、サーバークラスが受け入れられた接続をに保存し、ArrayList<Socket>クライアントにデータを送信したい場合は次のようにします。

Arraylist<Socket> sockets=Server.getSockets();
for(Socket current: sockets)
{
   ObjectOutputStream out=new ObjectOutputStream (current.getOutputStream());
   out.flush();
   out.writeObject(object);
   out.flush();
   out.close();
 }

しかし、それは機能しません。どうしたの?

4

1 に答える 1

1

あなたのコード スニペットには何の問題もありません。私が感じる唯一の問題は、クライアント コードの実装方法です。クライアントコードがこのようなものだとしましょう。

Socket clientSocket = new Socket(ip, port);
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
while ( true ){
String sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
outToServer.flush();

DataInputStream is = new DataInputStream(clientSocket.getInputStream());
System.out.println(is.readLine());
}

現在、このクライアントはコンソールから入力を読み取ってサーバーに送信しており、応答を待つためにブロックすることを投稿しています。サーバーがメッセージ'fire'を受信した場合、[あなたが望むもの] にデータを送信すると仮定しましょう。これで、サーバーに接続された 2 つのクライアントClientAClientBができました。

1. ClientA blocked at user-input (console)
2. User enter 'abc'
3. ClientA moves on sends 'abc' to server
4. ClientA blocks to read data from server
5. Server sends back 'abc' to ClientA [Assuming its an echo server]
6. ClientA reads the data, print it
7. ClientA moves back(while loop), blocked again for user input.

同じことが ClientB でも発生するため、コンソールからのユーザー入力に対して両方がブロックされます。
ここで、ClientA ユーザーがマジック ワード [この場合は「fire」] を送信すると、サーバーはそれがマジック ワードであることを識別し、ClientA と ClientB にデータの送信を開始し

ます。ここで、ClientA と ClientB の状態であることに注意してください。、この時点でClientAはデータを送信したばかりでポイント4にあるため、サーバーからのデータの読み取りがブロックされているため、サーバーがメッセージを送信すると読み取りと表示が可能になりますが、clientBはポイント1にあり、コンソールからのデータの取得がブロックされます..サーバーがデータを送信したとしても、ClientBには読み取るデータがありますが、ポイント1でスタックしているため、書き込み後にサーバーからの接続を閉じているため、ClientBが何らかの形でポイント1からポイントに移動した場合4、ソケットはすでに閉じられているため、再度読み取ることができません。サーバーは ClientA と ClientB の両方にデータを送信していますが、ClientA だけがデータを取得できます。

ふぅ!! かなり長い説明です。問題を解決するための方向性を示していると思います

参照用のサーバー コード

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;


public class BroadCastTCPServer {

    private static ArrayList<Socket> sockets = new ArrayList<Socket>();
    //Usage: java TCPServer port
    public static void main(String args[]){

        BroadCastTCPServer server = new BroadCastTCPServer();
        try {
            server.startServer("9999");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void startServer(String portStr) throws IOException {

        int port = Integer.parseInt(portStr);
        ServerSocket  serverSocket = new ServerSocket(port);

         System.out.println("Listening on IP:" +  serverSocket.getInetAddress().getHostAddress() + " Port:"+port);

         while(true){
            Socket connectionSocket = serverSocket.accept();
            sockets.add(connectionSocket);
            System.out.println("New client connection:" + connectionSocket.getRemoteSocketAddress());
            ClientHandler cl = new ClientHandler(connectionSocket);
            Thread clientThread = new Thread(cl);
            clientThread.start();
         }

    }

    public void sendAll() throws Exception{
        System.out.println("No of connections:" + sockets.size());
        for(Socket current: sockets){
            System.out.println(current.getRemoteSocketAddress());
           ObjectOutputStream out=new ObjectOutputStream (current.getOutputStream());
           out.flush();
           out.writeObject("Tata\n");
           out.flush();
           //out.close();
         }
    }

    class ClientHandler implements Runnable{

        Socket socket;
        public ClientHandler(Socket socket){
            this.socket = socket;
        }
        @Override
        public void run() {
            BufferedReader inFromClient = null;
            ObjectOutputStream out = null;
            BufferedWriter br = null;
            try {
                inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out=new ObjectOutputStream (socket.getOutputStream());
                OutputStreamWriter or= new OutputStreamWriter(out);
                br = new BufferedWriter(or);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            while(true){
            String clientSentence= null;
            try {
                clientSentence = inFromClient.readLine() ;
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            System.out.println("Received: " + clientSentence);
            if (clientSentence.equalsIgnoreCase("fire")) {
                try {
                    sendAll();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else{
                try {
                    br.write(clientSentence + "\n" );
                    br.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            }
        }

    }

}
于 2013-02-01T20:05:03.203 に答える