Вопрос по sockets, java – Связь клиент-сервер-клиент с использованием сокетов

4

Я создаю небольшое приложение чата, в котором клиент A хочет отправить что-то клиенту C с сервером B между ними. Прежде всего, это правильный подход к проблеме? Я могу отправлять и получать данные на сервер и с сервера, но он ограничен только клиентом. Например, если клиент A отправляет данные на сервер B, а клиент C отправляет данные на сервер B, я могу отправить данные обратно на A и С просто как эхо-сервер. Но я хочу перенаправить данные, поступающие от клиента A, на клиент C через сервер B.

Ниже приведен код сервера:

public class Server {
    public static void main(String[] args) {
        int port = 666; //random port number
        try {
            ServerSocket ss = new ServerSocket(port);
            System.out.println("Waiting for a client....");

            System.out.println("Got a client :) ... Finally, someone saw me through all the cover!");
            System.out.println();
            while(true) {
                Socket socket = ss.accept();

                SSocket sSocket = new SSocket(socket);
                Thread t = new Thread(sSocket);
                t.start();
                System.out.println("Socket Stack Size-----"+socketMap.size());
            }
        }
        catch (Exception e) { }
    }
}

class SSocket implements Runnable {
    private Socket socket;

    public SSocket(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();

            DataInputStream dIn = new DataInputStream(in);
            DataOutputStream dOut = new DataOutputStream(out);

            String line = null;
            while (true) {
                line = dIn.readUTF();
                System.out.println("Recievd the line----" + line);
                dOut.writeUTF(line + " Comming back from the server");
                dOut.flush();
                System.out.println("waiting for the next line....");    
            }
        }
        catch (Exception e) { }
    }
}

Код клиента:

public class Client {
    public static void main(String[] args) {
        int serverPort = 666;

        try {
            InetAddress inetAdd = InetAddress.getByName("127.0.0.1");
            Socket socket = new Socket(inetAdd, serverPort);

            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();

            DataInputStream dIn = new DataInputStream(in);
            DataOutputStream dOut = new DataOutputStream(out);

            BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));

            System.out.println("Type in something and press enter. Will send it to the server and tell ya what it thinks.");
            System.out.println();

            String line = null;
            while (true) {
                line = keyboard.readLine();
                System.out.println("Wrinting Something on the server");
                dOut.writeUTF(line);
                dOut.flush();

                line = dIn.readUTF();
                System.out.println("Line Sent back by the server---" + line);
            }
        }
        catch (Exception e) { }
    }
}

Ваш Ответ

3   ответа
1

Client A sends message 'Hi' with address Client C to server B. Server B receives message and adds it to message queue of client C. Thread in server B which communicates with client C check message queue, retrieve message and sends it to client C. Client C receives message.
0

у вас, должно быть, проблема с получением сообщения от класса Server или SSocket. Что происходит с вашим кодом, так это то, что когда вы отправляете сообщение от клиента на сервер, класс Server получает ваши сообщения, а также выдает эхо сообщения в клиенте. Однако, когда вы отправляете сообщение из класса Server, вы не получаете никаких сообщений в классе Client.

Чтобы это работало, вам нужно изменить код следующим образом:

SSocket Class
String line = null;
while (true) {
    line = dIn.readUTF();
    System.out.println("Recievd the line----" + line);
    dOut.writeUTF(line + " Comming back from the server");
    dOut.flush();
    System.out.println("waiting for the next line....");
}

Вы должны добавить эти строки:

String Line2 = take.nextLine(); //The user types a message for the client
dOut.writeUTF(Line2 + " Comming back from the server"); //The message is sent to the client

Заменитьwhile Цикл с этим, и он будет работать нормально.

while (true) {       
    line = dIn.readUTF(); //Takes the msg from the client
    System.out.println("Recievd the line----" + line); //Prints the taken message

    String Line2 = take.nextLine(); //The user types a message for the client
    dOut.writeUTF(Line2 + " Comming back from the server"); //The message is sent to the client
    dOut.flush();
    System.out.println("waiting for the next line....");
}
5

Socket для этого, вот оноSocket socket = ss.accept();, ваша переменная сокета будет содержать этот клиент.

Теперь, если вы просто продолжаете добавлять свой клиентский сокет вarraylist в вашемwhile цикл, у вас будет список клиентов, активно подключенных к вашему серверу, например:

после принятия:

clients = new ArrayList<DataOutputStream>();
Socket socket = ss.accept();
os = new DataOutputStream(socket.getOutputStream());
clients.add(os);

Теперь, когда у вас есть все клиенты в этомclients arraylist, вы можете пройти через это, или с помощью какого-либо протокола определить, какой клиент я должен отправить данные после прочтения.

Iterator<DataOutputStream> it = clients.iterator();
while ((message = reader.readLine()) != null) { //reading    
    while (it.hasNext()) {
        try {
            DataOutputStream oss = it.next();
            oss.write(message);//writing
            oss.flush();
        }
        catch (Exception e) { }
     }
 }

Это перебирает все доступные клиенты в массиве и отправляет их всем. Вы можете определить способы отправки только некоторым.

Например:   поддерживатьActiveClients arraylist и с некоторым взаимодействием GUI может быть или, возможно, определить, что все клиенты вы хотите отправить сообщение. Затем добавьте только эти клиенты outputStreams вActiveClients

ActiveClients.add(clients.get(2));

или удалите их, если они вам не нужны.

ActiveClients.remove(clients.get(2));

а теперь просто перебратьarraylist отправить данные, как указано выше.

Похожие вопросы