[英]Java - TCP/IP - Server can't send message back to Client?
我想将一个对象从客户端发送到本地服务器以添加到数据库,然后将结果发送回该对象是否成功发送。 该对象已成功发送,但是我的服务器没有将结果发送回客户端,并且由于等待服务器的响应而导致我的客户端帧形式挂起。 我不知道我的代码有什么问题。 您能告诉我一些解决方法吗?
这是发送结果的功能:
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;
}
由于sendResult()
的myServer.accept()
,服务器再次等待传入的客户端连接,而这已经在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) {
...
}
}
如果要发送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
接受传入的套接字对象。
您可以为我们提供一个Client类,以便我们可以查看是否缺少对传入套接字的接受。
在方法结束时,请确保关闭流和套接字。
out.close();
in.close();
socket.close();
您两次调用accept()
。 这是没有意义的。 你需要:
Socket
。 Socket
发送响应。 您还希望为每个接受的套接字创建一个新线程,并且还希望在该线程中执行所有I / O, 包括创建ObjectInputStream
和ObjectOutputStream
。 否则,您的服务器将无法正确使用多线程和多客户端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.