Можно ли создать более 1 потребителей на InputStream и OutputStream? - PullRequest
0 голосов
/ 11 сентября 2018

Я реализую проект Java с использованием клиент-серверной архитектуры.Мой клиент заходит в бесконечный цикл при подключении через сокет.

EDIT1: я изменил свои клиентские и серверные программы на минимальные, полные и проверяемые коды.Проблема возникает из-за наличия нескольких потребителей в одном и том же входном и выходном потоках (как указано в ответе ниже).

Вот мой код сервера:

import java.net.*;
import java.io.*;

class Demo {
    int a;
    String b;

    Demo() {
        a = 10;
        b = "Sample";
    }
}

class Streamsample {
    private ServerSocket serverSocket = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;

    Streamsample() {
        try{
            serverSocket = new ServerSocket(3000);
            Socket s = serverSocket.accept();
            dis = new DataInputStream(s.getInputStream());
            dos = new DataOutputStream(s.getOutputStream());
            ois = new ObjectInputStream(s.getInputStream());
            oos = new ObjectOutputStream(s.getOutputStream());
            System.out.println(dis.readUTF());

            Demo d = (Demo)ois.readObject();
            System.out.print(d.a + " " + d.b);  
            dis.close();
            dos.close();
            ois.close();
            oos.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Streamsample ss = new Streamsample();
    }
}

Вот мой код клиента:

import java.net.*;
import java.io.*;

class Demo {
    int a;
    String b;

    Demo() {
        a = 10;
        b = "Sample";
    }
}

class Streamclient {
    private Socket s = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;

    Streamclient() {
        try{
            s = new Socket("localhost",3000);
            dis = new DataInputStream(s.getInputStream());
            dos = new DataOutputStream(s.getOutputStream());
            ois = new ObjectInputStream(s.getInputStream());
            oos = new ObjectOutputStream(s.getOutputStream());

            dos.writeUTF("Hello");
            Demo d = new Demo();
            oos.writeObject(d);

            dis.close();
            dos.close();
            ois.close();
            oos.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Streamclient ss = new Streamclient();
    }
}

Система, которую я внедряю, требует, чтобы мой клиент отправлял и получал objects а также String с, int с и т. д. Я пытаюсь использовать DataInputStream и DataOutputStream для String с, int с и ObjectInputStream, ObjectOutputStream для object с,Моя программа идет в бесконечный цикл.Так что я должен использовать ObjectStream's for passing String s, int s as well and completely omit DataStream`s или есть обходной путь, который позволит использовать оба потока в одном сокете?

1 Ответ

0 голосов
/ 11 сентября 2018

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

TicketBooking.oos = new ObjectOutputStream(s.getOutputStream());
TicketBooking.ois = new ObjectInputStream(s.getInputStream());

Зачем вам нужны два потребителя для каждого из ваших входных и выходных потоков?

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