在java多线程应用程序中在客户机(客户机-服务器-客户机-java程序)之间传递对象

n3h0vuf2  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(229)

我对java非常陌生(因此,隐式地说是java网络)。我正在尝试为一个应用程序(如chat-one)创建一个客户机-服务器框架,在实际的聊天之前,在客户机之间执行密钥交换。服务器就像在客户机之间传递对象的通道。
目前,我在密钥交换步骤被阻塞,执行如下:
->客户机a启动密钥交换并向服务器发送一个包含nonce值的对象。
->服务器接收对象并将其传递给客户端b;
->客户机b从服务器接收对象,保存客户机a的nonce值,并为其自身生成一个新的nonce值,该值存储在同一对象类型中并发送给服务器。
->现在服务器应该从套接字读取客户机b发送的对象,并将其传递给客户机a。当客户机a收到客户机b的nonce时,它应该启动一个身份验证操作,但这是一个未来的问题。
两个客户机都可以向服务器发送和接收对象,但是服务器在第二步之后失败(它从客户机a接收对象并将其传递给客户机b,现在它应该从客户机b接收对象以便将其传递给客户机a)。在尝试从第二个线程读取对象时,发生了ioexception,我找不到问题的根源。
服务器上执行传递操作的代码如下:

//Case 0: A -> Server -> B;
    //Case 1: B -> Server -> A;
    int state = 0;
    switch (state) {
        case 0: 
            System.out.println("Reading KE message 1...");
            readKE(ct2.getsInput(),ct1.getsOutput());
            System.out.println("The KEMsg1 was sent to " + ct1.nickname);
            state ++;

        case 1:
            System.out.println("Reading KE message 2...");
            readKE(ct1.getsInput(),ct2.getsOutput());
            System.out.println("The KEMsg2 was sent to " + ct2.nickname);
            state++;

从流中读取对象的readke函数:

public void readKE(ObjectInputStream sInput, ObjectOutputStream sOutput) {
    this.sOutput = sOutput;
    this.sInput = sInput;
    try {
        System.out.println("Reading object...");
        ChatMessage msg = (ChatMessage) sInput.readObject();
        System.out.println("Passing KE message");
        passKE(msg,sOutput);
        System.out.println("Message KE was sent successfully");
    } catch (ClassNotFoundException e1) {
        System.out.println("Error occured while reading object from socket - ClassNotFoundException");
        e1.printStackTrace();
    } catch (IOException e1) {
        System.out.println("Error occured while reading object from socket - IOException");
        e1.printStackTrace();
    }
}

实际将对象传递给其他客户端的passke函数:

public void passKE(ChatMessage msg, ObjectOutputStream sOutput) {
    this.sOutput = sOutput;
    try {
        sOutput.writeObject(msg);
    } catch (IOException e) {
        System.out.println("Error occured while writing object to socket");
        e.printStackTrace();
    }
    try {
        sOutput.flush();
    } catch (IOException e) {
        System.out.println("Error occured while executing flush");
        e.printStackTrace();
    }

}

因为服务器可以执行第一个操作(从a接收并发送到b),所以我不认为有必要在这里添加整个代码,因为我很确定问题与更改流之类的操作有关…或者我错了。我在下面添加使用服务器和2个客户端运行代码的结果:
clienta-服务器-客户端b控制台结果

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题