使用objectinputstream和objectoutputstream的java网络

使用objectinputstream和objectoutputstream的java网络,java,networking,Java,Networking,我制作了两个小型控制台应用程序服务器和客户端,以了解如何让服务器和客户端使用objectInputStream和objectOutputStream相互发送多个变量值。然而,我的客户机程序似乎在我要求它创建objectInputStream对象时就卡住了。这是我的密码: public class client { static String key, temp, tester; static UserInfo ui = new UserInfo(); public static void m

我制作了两个小型控制台应用程序服务器和客户端,以了解如何让服务器和客户端使用objectInputStream和objectOutputStream相互发送多个变量值。然而,我的客户机程序似乎在我要求它创建objectInputStream对象时就卡住了。这是我的密码:

public class client {

static String key, temp, tester;
static UserInfo ui = new UserInfo();

public static void main(String[]args) throws UnknownHostException, IOException, ClassNotFoundException {
    //CONNECT TO SERVER
    Scanner scanner = new Scanner(System.in);
    Socket socket = new Socket("127.0.0.1", 1350);
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

    //INPUT
    System.out.println("Client:" + "Enter a message!");
    ui.message = scanner.nextLine();
    System.out.println("Client:" + "Enter a number!");
    ui.number = scanner.nextInt();

    //WRITE & SEND
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    oos.writeObject(ui);
    oos.flush();

    //RECEIVE AND READ
    UserInfo info = (UserInfo) ois.readObject();

    System.out.println("Server:" + info);
}
}

这是我的服务器代码:

public class ser {

static String key, temp;
static UserInfo ui = new UserInfo();

public static void main(String[]args) throws IOException, ClassNotFoundException {
    ServerSocket s1 = new ServerSocket(1350);
    System.out.println("Server started.");
    Socket soc = s1.accept();

    ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
    ObjectInputStream ois = new ObjectInputStream(soc.getInputStream());
    UserInfo info = (UserInfo) ois.readObject();

    info.message += ", and this is the server's message-part";
    info.number *= 3;

    oos.writeObject(ui);
    oos.flush();
}

}

public class UserInfo implements Serializable{
public int number;
public String message;
}
需要明确的是:我没有收到任何错误,它只是在到达objectinputstream时停止。使用objectinput/output流类是否错误?我还听说了一些关于dataoutput/inputstream的事情。这就是我应该尝试的吗

编辑:使用这个新编辑的代码,它不再冻结或死锁,但是我得到了一个异常错误,告诉我它不知道源代码:

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at cli.main(cli.java:33)
它只是在到达objectoutputstream时停止

不,没有。它在到达新ObjectInputStream时停止


您必须先创建ObjectOutputStream,然后再创建ObjectInputStream。否则,您将无法读取流标题。

我们可以看到UserInfo吗?可能是因为您没有将字段编号和消息公开。我对其进行了编辑,但没有公开:@JacobB.:我可以保证您是错的。您的猜测将导致编译错误,而不是运行时异常或冻结的应用程序。编辑:在OP发布UserInfo类之前所做的声明。@HovercraftFullOfEels哦,是的,没错。是的,你是对的,这就是我的意思,我犯了一个打字错误。