我对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控制台结果
暂无答案!
目前还没有任何答案,快来回答吧!