Может ли клиентская программа иметь серверный сокет для связи с другими клиентскими программами? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь реализовать многопоточную программу сокетов, которая имитирует пять компьютеров и контроллер, взаимодействующий друг с другом через сокеты.Контроллер имеет сокет сервера, который принимает входящие сокеты (с компьютеров).Как только он достигает максимальной емкости системы (скажем, пять), он отправит стартовое сообщение на эти компьютеры, используя потоки, созданные при приеме входящих сокетов.

Когда каждый компьютер получает сообщение «Пуск» от контроллера, я хочу, чтобы каждый компьютер мог обмениваться данными с другими компьютерами (не полагаясь на контроллер (передача сообщений с компьютера на контроллер на компьютер).работа заключается в том, чтобы каждый компьютер создал экземпляр сокета сервера, чтобы он мог принимать входящие сокеты с компьютеров, а также создать экземпляр другого сокета клиента, чтобы другие серверные сокеты с разных компьютеров могли его принять.

Я знаю, что это может показаться довольно запутанным, но в основном я хочу использовать сокет сервера на каждой клиентской программе (компьютере), чтобы он мог слушать других клиентов (компьютер), не полагаясь на контроллер.

Возможно ли это? Могу ли я создать экземпляркаждая клиентская программа (компьютер) имеет сокет сервера, чтобы он мог прослушивать другие компьютеры? Требуется ли другой IP-адрес и / или номер порта от сокета сервера контроллера? Нужно ли создавать x количество сокетов для x количествокомпьютеры?

Может быть, мой Java-код может понять это.

Controller.java

    package timetableexchange;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Controller {

final int MAX_SYSTEMS = 2;

static ArrayList<ServerConnection> conns = new ArrayList<ServerConnection>();   // connections to computer
static int finishedCount = 0;                                                   // number of finished computers

ServerSocket ss;            // server socket

public static void main(String[] args) throws IOException {
    // Instantiate controller
    new Controller(8000);
}

public Controller(int port) throws IOException {
    // Instantiate server socket
    ss = new ServerSocket(8000);
    int i = 0;
    // Listen and accept clients (1 for testing)
    while (i < MAX_SYSTEMS) {
        Socket s = ss.accept();
        // add to list
        ServerConnection conn = new ServerConnection(i++, s);
        conns.add(conn);
    }
    // start server connection thread
    for (i = 0; i < conns.size(); ++i) {
        conns.get(i).start();
    }
    ss.close();
}

// Thread for communicating between controller and computer
private class ServerConnection extends Thread {

    Socket socket;
    BufferedReader in;
    PrintWriter out;
    int identifier;

    // constructor
    public ServerConnection(int i, Socket s) throws IOException {
        this.identifier = i;
        this.socket = s;
        this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        this.out = new PrintWriter(socket.getOutputStream(), true);
        System.out.println("Client Connected");
    }

    @Override
    public void run() {
        System.out.println("ServerConnection started");
        // send ID to computers
        sendAll(identifier + "");
        // send Start message to computers
        sendAll("Start");
        // Check if a computer sent back a Finish message
        // If all computers are finished, then send out Tear Down message.
        while (true) {
            try {
                String clientInput = in.readLine();
                if (clientInput.equals("Finish")) {
                    finishedCount += 1;
                    if (finishedCount == conns.size()) {
                        sendAll("Tear Down");
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }
    }

    private void sendAll(String text) {
        for (int i = 0; i < conns.size(); ++i) {
            ServerConnection conn = conns.get(i);
            conn.out.println(text);
        }
    }
}

}

Computer.java

package timetableexchange;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Vector;

public class Computer {

final int MAX_SYSTEMS = 2;

int identifier;                                         // Computer ID
int eventCount;                                         // Number of Generated Events
ArrayList<Socket> sockets = new ArrayList<Socket>();    // List of (client) sockets
Vector<Integer> timestamp = new Vector<Integer>();      // Time-stamp vector

Socket socketToServer;                                  // Socket to Connect to Controller
BufferedReader inputFromServer;                         // Input Stream from Controller
PrintWriter outputToServer;                             // Output Stream to Controller
String textFromServer;                                  // String sent from Controller

ServerSocket ss;                                        // Server Socket to communicate with other clients (computers)
Socket socketToClient;                                  // Socket to Connect to Computer
BufferedReader inputFromClient;                         // Input Stream from Computer
PrintWriter outputToClient;                             // Output Stream to Computer

public static void main(String[] args) throws IOException {
    // Instantiate Computer
    new Computer("127.0.0.1", 8000);
}

// Constructor
public Computer(String hostname, int port) throws IOException {
    // Instantiate Socket (to Controller) and Streams (to Controller)
    socketToServer = new Socket(hostname, port);
    inputFromServer = new BufferedReader(new InputStreamReader(socketToServer.getInputStream()));
    outputToServer = new PrintWriter(socketToServer.getOutputStream(), true);

    // Check if Controller sent the computer its ID
    while (true) {
        try {
            textFromServer = inputFromServer.readLine();
            // set identifier
            identifier = Integer.parseInt(textFromServer);
            System.out.println(identifier);
            break;  // break loop
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }

    // Check if Controller sent the start message
    while (true) {
        textFromServer = inputFromServer.readLine();
        if (textFromServer.equals("Start"))
            System.out.println("Start message received");
            break;  // break loop
    }

    // Instantiate Server Socket (for Clients)
    ss = new ServerSocket(port + identifier + 1);

    // Instantiate Client Socket for Other Clients to Hear
    socketToClient = new Socket();
    inputFromClient = new BufferedReader(new InputStreamReader(socketToClient.getInputStream()));
    outputToClient = new PrintWriter(socketToClient.getOutputStream());

    // listen to server socket and add accepted socket to list  
    for (int i = 0; i < MAX_SYSTEMS - 1; ++i) {
        Socket s = ss.accept();
        System.out.println("Client accepted");
        sockets.add(s);
    }

    Thread readEvent = new Thread(new Runnable() {
        @Override
        public void run() {
            /**
             * Read from input stream
             * Read the vector inside the input stream
             * Compare vectors and choose the largest integer (synchronized)
             * Add 1 to the corresponding socket. (synchronized)
             */
        }
    });

    Thread writeEvent = new Thread(new Runnable() {
        @Override
        public void run() {
            /**
             * Generate random number between 0 and 4.
             * If zero, then add 1 to its own socket in vector.
             * Else, send vector to random socket via output stream
             */
        }
    });

    readEvent.start();
    writeEvent.start();
}

}

Я ценю помощь!

1 Ответ

0 голосов
/ 14 ноября 2018

Короче говоря:

Возможно ли это?

Да - а почему нет?

Могу ли я создать экземпляр каждой клиентской программы (компьютера)?) серверный сокет, чтобы он мог слушать другие компьютеры?

Да - вы можете делать все, что захотите или нуждаетесь

Требуется ли другой IP-адрес и / илиили номер порта из сокета сервера контроллера?

IP-адрес принадлежит «физическому компьютеру» / интерфейсу hetwork и не имеет значения, что вы пытаетесь сделать - все может работать на одном компьютере и всеможет работать на том же IP-адресе (например, 127.0.0.1).У вас должны быть выделенные порты для каждого сокета сервера, который вы собираетесь открыть, и ваши клиентские сокеты должны знать IP и номера портов для связи.для клиентского сокета вам не нужно заботиться ни о IP, ни о номере порта.

Нужно ли создавать x количество сокетов для x количества компьютеров?

Вопросне имеет никакого смысла ro ro - это ваше дизайнерское решение, сколько серверных сокетов вам нужно создать - один сокет сервера для одного порта, вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...