ObjectoutStram не устанавливается при попытке подключить два клиентских сокета к серверу - PullRequest
0 голосов
/ 09 июля 2020

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

public class Client_1 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    Socket s1 = new Socket("localhost", 8888);
    Socket s2 = new Socket("localhost", 8888);
    BufferedOutputStream bos1 = new BufferedOutputStream(s1.getOutputStream());
    ObjectOutputStream oos1 = new ObjectOutputStream(bos1);
    oos1.flush();
    BufferedOutputStream bos2 = new BufferedOutputStream(s2.getOutputStream());
    ObjectOutputStream oos2 = new ObjectOutputStream(bos2);
    oos2.flush();
    BufferedInputStream bis1 = new BufferedInputStream(s1.getInputStream());
    ObjectInputStream ois1 = new ObjectInputStream(bis1);
    BufferedInputStream bis2 = new BufferedInputStream(s2.getInputStream());
    ObjectInputStream ois2 = new ObjectInputStream(bis2);


        oos1.writeObject("a message from first client s1");
        oos1.flush();
        oos2.writeObject("a message from second client s2"); // sever does not receive this one
        oos2.flush();
}
}

вот код сервера, ожидающий клиента

public class Main {
    public static void main(String[] args) throws IOException {

        WaitForClient();
    }

    public static void WaitForClient() throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        int i = 0;
        while(true) {
            Socket client = serverSocket.accept();
            i++;
            System.out.println(i + " client connected");
            ClientThread clientThread = new ClientThread(client);
            Thread thread = new Thread(clientThread);
            thread.setDaemon(true);
            thread.start();
        }

    }

, а это ClientThread, который получает информацию из сокета

public class ClientThread implements Runnable {
    
    Socket clientSocket;
    ObjectInputStream oIStream;
    ObjectOutputStream oOStream;
    Object inputObject;
    BufferedInputStream bIS;
    BufferedOutputStream bOS;
    

    public ClientThread(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    @Override
    public void run() {
        try {
            bOS = new BufferedOutputStream(clientSocket.getOutputStream());
            bIS = new BufferedInputStream(clientSocket.getInputStream());
            oOStream = new ObjectOutputStream(bOS);
            oOStream.flush();
            oIStream = new ObjectInputStream(bIS);

            while (clientSocket.isConnected()) {
                if (bIS.available() > 0) {
                    inputObject = oIStream.readObject();
                    doService(inputObject);
                    System.out.println(inputObject.toString());
                    inputObject = null;
                }
            }
            System.out.println("connection is closed!!!");
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("socket exception" + e.getMessage());
        }

    }
}

, и это то, что выводится на консоль

1 client connected
2 client connected
a message from first client s1   // input from the first socket but nothing from the second socket

1 Ответ

0 голосов
/ 09 июля 2020

Этот код должен работать, вы получаете какую-либо ошибку в методе doService ?. В случае, если какое-либо исключение при l oop прервется, и оператор печати не будет выполнен. В противном случае он должен распечатать данные от обоих клиентов

...