我的问题很简单。我只想再次使用客户端对象套接字。
通常,每当客户端尝试连接服务器时,人们都会创建一个新的套接字:
Socket test = new Socket (host, port);
OutputStream out = test.getOutputStream ();
InputStream in = test.getInputStream ();
out.writeObject (object)
out.flush ();
in.readObject();
在第一个 writeObject 之后,我确实想再次通过重用 out.writeObject(nextObject) 向服务器发送更多信息,但是服务器不再可用。为了让它工作,我必须完成上述所有步骤。为什么?
这是我用来测试我的意思的代码。 “Second Request doesn't ...”之后的代码没有到达服务器。但是,如果我删除这些评论上方的评论,它将通过。为什么我不能在不使用 new Socket() 的情况下重复使用相同的客户端套接字对象。
Class Hello -> Data passed between the server and the client
Class TestClient -> Client
Class TestServer -> Server
package tests;
import java.io.Serializable;
public class Hello implements Serializable {
String hola = "hello my friend";
public String getHello () {
return hola;
}
public void setHello (String str) {
hola = str;
}
}
package tests;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TestClient {
public static void main(String[] args) {
try {
ObjectOutputStream clientOutput;
ObjectInputStream serverInput;
Hello goingout = new Hello ();
Socket client = new Socket ("localhost", 5555);
clientOutput = new ObjectOutputStream (client.getOutputStream());
serverInput = new ObjectInputStream (client.getInputStream());
clientOutput.writeObject(goingout);
clientOutput.flush();
Hello comingin = (Hello) serverInput.readObject();
System.out.println ("first time received: " + comingin.getHello());
/*
* Socket client = new Socket ("localhost", 5555);
clientOutput = new ObjectOutputStream (client.getOutputStream());
serverInput = new ObjectInputStream (client.getInputStream());
*/
/*
* Second request doesn't got through the server
*/
comingin.setHello("again");
clientOutput.writeObject(goingout);
clientOutput.flush();
comingin = (Hello) serverInput.readObject();
System.out.println ("second time received: " + comingin.getHello());
} catch (ClassNotFoundException ex) {
System.out.println (ex.getMessage());
} catch (UnknownHostException ex) {
System.out.println (ex.getMessage());
} catch (IOException ex) {
System.out.println (ex.getMessage());
}
}
}
public class TestServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(5555, 100);
ObjectInputStream clientInput;
ObjectOutputStream serverOutput;
for (;;) {
System.out.println ("Listening for connections");
Socket fromClient = server.accept();
serverOutput = new ObjectOutputStream (fromClient.getOutputStream());
clientInput = new ObjectInputStream (fromClient.getInputStream());
Hello received = (Hello) clientInput.readObject();
serverOutput.writeObject(received);
serverOutput.flush();
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(TestServer.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(TestServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
最佳答案
您需要使用线程服务器。
一个服务器可以服务多个客户端。每个服务器套接字必须由它自己的线程处理。服务器监听一个已知的套接字,每个客户端使用一个单独的套接字进行连接(因此多个客户端可以在同一台主机上运行)。
首先,JavaDocs 是理解如何或为什么你应该使用一个库的最糟糕的地方之一,它们实际上只告诉你什么这个库做了什么.
只有当您使用 single threaded server 时,您关于不可能的帖子才是正确的.
Oracle 在 Java server sockets 上有一个页面这解释了单个服务器的多个客户端(重用)。
他们还有一个 advanced sockets page更详细。
关于java - 再次重新使用 java 套接字客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901637/