【问题标题】:Is it possible to create more than 1 consumers on InputStream and OutputStream?是否可以在 InputStream 和 OutputStream 上创建超过 1 个消费者?
【发布时间】:2019-02-16 02:44:49
【问题描述】:

我正在使用客户端-服务器架构实现一个 Java 项目。通过套接字连接时,我的客户端进入了无限循环。

编辑1: 我已将我的客户端和服务器程序更改为最少、完整且可验证的代码。由于在相同的输入和输出流上有多个消费者(如下面的答案所指出的),因此出现了这个问题。

这是我的服务器代码:

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 以及Strings、ints 等。我正在尝试将DataInputStreamDataOutputStream 用于Strings, ints 和 ObjectInputStreamObjectOutputStreamobjects。我的程序进入无限循环。那么我应该使用ObjectStream's for passingStrings,ints as well and completely omitDataStream`s 还是有一种解决方法可以让两个流在同一个套接字上使用?

【问题讨论】:

    标签: java sockets inputstream outputstream


    【解决方案1】:

    您两次使用相同的流 - 它无法按设计工作。您的每个流应该只有一个消费者,例如:

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

    为什么每个输入和输出流都需要两个消费者?

    【讨论】:

    • 有些功能需要转strings,有些功能需要通过socket转objects。这就是我同时使用 DataStream 和 ObjectStream 的原因
    猜你喜欢
    • 2022-01-17
    • 2012-07-15
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多