服务器未将消息转发给客户端
Server isn't forwarding the message to the client
我是 Java 套接字通信的新手,我试图在不使用线程的情况下将 3 个客户端连接到服务器,因为连接到服务器的客户端数量将是 3。我已经在服务器中写入一个条件来标记从客户端接收到的输入并将写入发送到相应的流。但是消息没有到达服务器,所以我不确定是客户端没有写入流还是服务器无法接收数据。我正在尝试在连接的客户端之间建立一个加密协议以用于演示目的。
我之前用的是BufferedReader
和PrintStream
,因为我是用键盘输入测试的,后来改成数据流好像还是不行
这里是我在 Server.java 的代码转发消息,控件似乎根本没有进入这个循环(不确定)。
while(true){
String recvd=cin2.readLine();
System.out.println("At server: "+recvd);
StringTokenizer st = new StringTokenizer(recvd);
String MsgToSend=st.nextToken();
String recipient=st.nextToken();
if(recipient.equalsIgnoreCase("client1")){
cout2.writeUTF(MsgToSend);
}
else if(recipient.equalsIgnoreCase("client2")){
cout.writeUTF(MsgToSend);
}
else if(recipient.equalsIgnoreCase("client3")){
cout3.writeUTF(MsgToSend);
}
}
这是我的客户端代码,
while(i==0){
String s1="A";
String s2="B";
String s3="client1";
String toSend=String.join(" ",s1+s2,s3);
System.out.println("toSend :"+toSend);
sout.writeUTF(toSend);
sout.flush();
i++;
}
接收客户,
while (true){
s=sin.readLine();
System.out.print("Server : "+s+"\n");
}
不确定是客户端无法写入还是服务器无法读取。有任何更正代码的建议或解决方案吗?
您的服务器文件中的套接字导航逻辑似乎很奇怪,因为您手动创建了一个带有关键字 client1 的字符串,然后将其标记为导航。通过这种方法,您的流程将变得静态并且协议的建立变得困难。
请看:
您通过形成字符串 AB client1 将数据发送到客户端 1,然后您的服务器文件的第一行使用客户端 2 套接字读取。 (将数据从 client1 套接字发送到 client1 套接字,不对)。
请将其更改为client1 socket reading,使用prinln()和readline()发送和读取socket数据,然后检查您的流程是否正常!
此外,对于协议流,您必须将数据发送到其他两个套接字,而不是发送到正在发送的套接字。
例如:如果您要将数据从客户端 1 发送到客户端 2,根据您的方法,您必须将字符串 AB client2 发送到服务器,将其标记化并将流导航到客户端 2。
希望对您有所帮助!
谢谢,
阿雷德
我是 Java 套接字通信的新手,我试图在不使用线程的情况下将 3 个客户端连接到服务器,因为连接到服务器的客户端数量将是 3。我已经在服务器中写入一个条件来标记从客户端接收到的输入并将写入发送到相应的流。但是消息没有到达服务器,所以我不确定是客户端没有写入流还是服务器无法接收数据。我正在尝试在连接的客户端之间建立一个加密协议以用于演示目的。
我之前用的是BufferedReader
和PrintStream
,因为我是用键盘输入测试的,后来改成数据流好像还是不行
这里是我在 Server.java 的代码转发消息,控件似乎根本没有进入这个循环(不确定)。
while(true){
String recvd=cin2.readLine();
System.out.println("At server: "+recvd);
StringTokenizer st = new StringTokenizer(recvd);
String MsgToSend=st.nextToken();
String recipient=st.nextToken();
if(recipient.equalsIgnoreCase("client1")){
cout2.writeUTF(MsgToSend);
}
else if(recipient.equalsIgnoreCase("client2")){
cout.writeUTF(MsgToSend);
}
else if(recipient.equalsIgnoreCase("client3")){
cout3.writeUTF(MsgToSend);
}
}
这是我的客户端代码,
while(i==0){
String s1="A";
String s2="B";
String s3="client1";
String toSend=String.join(" ",s1+s2,s3);
System.out.println("toSend :"+toSend);
sout.writeUTF(toSend);
sout.flush();
i++;
}
接收客户,
while (true){
s=sin.readLine();
System.out.print("Server : "+s+"\n");
}
不确定是客户端无法写入还是服务器无法读取。有任何更正代码的建议或解决方案吗?
您的服务器文件中的套接字导航逻辑似乎很奇怪,因为您手动创建了一个带有关键字 client1 的字符串,然后将其标记为导航。通过这种方法,您的流程将变得静态并且协议的建立变得困难。
请看: 您通过形成字符串 AB client1 将数据发送到客户端 1,然后您的服务器文件的第一行使用客户端 2 套接字读取。 (将数据从 client1 套接字发送到 client1 套接字,不对)。 请将其更改为client1 socket reading,使用prinln()和readline()发送和读取socket数据,然后检查您的流程是否正常! 此外,对于协议流,您必须将数据发送到其他两个套接字,而不是发送到正在发送的套接字。
例如:如果您要将数据从客户端 1 发送到客户端 2,根据您的方法,您必须将字符串 AB client2 发送到服务器,将其标记化并将流导航到客户端 2。
希望对您有所帮助!
谢谢, 阿雷德