我想从我的客户端向我的localhost服务器发送一个对象以添加到数据库,并发回结果是否成功发送了对象。该对象已成功发送,但我的服务器未将结果发送回客户端,并导致我的客户端帧格式因等待服务器响应而被挂起。我不知道我的代码有什么问题。你能告诉我一些方法来解决这个问题吗?
以下是发送结果的函数:
public void sendResult(String result) {
try {
Socket clientSocket = myServer.accept();
System.out.println("Connected to client");
ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream());
os.writeObject(result);
System.out.println("Result sent");
} catch (Exception ex) {
ex.printStackTrace();
}
}
调用发送结果函数的地方:
public void service() {
try {
if (receiveStudent() != null) {
Student std = receiveStudent();
if (dao.addStudent(std)) {
System.out.println("OK");
sendResult("OK");
} else {
System.out.println("FAILED");
sendResult("FAILED");
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
此外,在服务功能中,控制台打印了" OK",这意味着if条件得到满足。
接受学生方法:
public Student receiveStudent() {
Student s = new Student();
try {
Socket clientSocket = myServer.accept();
System.out.println("Connect to client successfully");
ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
Object o = ois.readObject();
if (o instanceof Student) {
s = (Student) o;
return s;
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
答案 0 :(得分:2)
由于myServer.accept()
中的sendResult()
,服务器再次等待传入的客户端连接,而receiveStudent()
中已经发生这种情况。重用该连接。
分享您在receiveStudent()
中获得的客户端套接字,例如,将其转换为字段。
public Student receiveStudent() {
...
try {
clientSocket = myServer.accept();
...
} catch (Exception ex) {
...
}
...
}
然后在sendResult()
中重用该套接字以将结果发送给客户端。
public static void sendResult(String result) {
try {
...
ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream());
...
} catch (Exception ex) {
...
}
}
答案 1 :(得分:1)
如果你想发送一个String作为对象,为什么不要使用这样的东西:
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); //for sending String messages
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //for getting String messages
...然后当你需要发送时,你会这样做:
out.println(textToServer"); // send to server - don't forget LN in println.
out.flush(); // to clean buffer
它应该做你需要做的事情。
并确保您的客户端等待获得InputStream
您发送的内容,不要忘记这一点,因为它可能是客户端的问题。
也许客户不接受传入的Socket
,无论它是ObjectInputStream
还是BufferedReader
都会接受传入的套接字对象。
您可以向我们提供一个客户端类,以便我们可以查看是否缺少对传入套接字的接受。
在方法结束时,请确保关闭流和套接字。
out.close();
in.close();
socket.close();
答案 2 :(得分:1)
您正在拨打accept()
两次。这毫无意义。你需要:
Socket
。Socket
发送回复。您还想要为每个接受的套接字创建一个新线程,并且您还希望在该线程中执行所有I / O,包括创建{{1} }和ObjectInputStream
。否则您的服务器没有正确的多线程和多客户端。