我正在尝试创建一个应用程序(带游戏),客户端可以向服务器发送一些int
值,直到达不到某个值,客户端才能与服务器交换,发回值。
我的第一堂课是TCP应用程序的服务器。在这里,我有一个main()
方法,直到游戏结束。运行以从客户端获取对象的getMoveFromClient()
方法,以及将对象发送到客户端的sendRequestToClient(Game g, int reponse)
。这是代码:
public static void main(String[] args) {
serverLife = true;
cm = new ConnectionManagerServer(); // this one instanciates my Server options
Game g;
while (serverLife) { // boolean value that allows me to continue over
g = getMoveFromClient(); // get data from client, here every thing is ok
sendRequestToClient(g, 1); // send data to client, here it crashes.
serverLife = g.life; // the object has a parameter that tells if the value is reached or not. (end of the game)
}
}
public static Game getMoveFromClient() {
// this method get data from clients, and works fine.
}
直到这里,一切都很好。但是使用这种方法,将数据发送到客户端:
private static void sendRequestToClient(Game g, int reponse) {
try {
g.setResponse(reponse);
OutputStream out = cm.socket.getOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(out)) {
oos.writeObject(g);
oos.flush();
oos.close();
}
} catch (IOException ex) {
System.out.println("OutpuStreamError : " + ex.getMessage());
}
}
我有以下错误:OutpuStreamError : Software caused connection abort: socket write error
另一方面,在客户端,我有几乎相同的代码,在返回对象Game之前一直正常工作:
public static Game getRequestFromServer() {
Game g = null;
try {
InputStream in = mc.socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(in);
g = (Calcul) ois.readObject();
} catch (IOException ex) {
System.out.println("error reception" + ex.getMessage());
} catch (ClassNotFoundException ex) {
System.out.println("erreur lecture de l'objet" + ex.getMessage());
}
return jeu;
}
我有以下错误:error reception : Socket is closed
我有一个用于我的Game对象的类,另外两个用于处理客户端和服务器的连接端口和套接字。
public ConnectionManagerServer() {
try {
this.serverPort = 6464;
this.serverSocket = new ServerSocket(this.serverPort);
this.socket = this.serverSocket.accept();
} catch (IOException ex) {
System.out.println("serverSocket probleme d'initialisation : " + ex.getMessage());
}
}
和第二个:
public ConnectionManagerClient() {
try {
this.hostAdress = InetAddress.getByName("localhost"); // adresse du serveur
this.serverPort = 6464;
this.socket = new Socket(this.hostAdress, this.serverPort);
} catch (UnknownHostException ex) {
System.out.println("Erreur d'initalisation de l'adresse de l'hote : " + ex.getMessage());
} catch (IOException ex) {
System.out.println("Erreur d'initalisation de la connexion : " + ex.getMessage());
}
}
我不明白的是,当我尝试从客户端发送到服务器时,它工作正常,服务器能够读取对象内容,但当我尝试从服务器发送到客户端,我无法从服务器读取对象。是因为我没有打开插座吗?
编辑:
我是否必须在客户端类中使用accept()
从服务器获取数据?这是错误的。
答案 0 :(得分:3)
关闭套接字的输入流或输出流会关闭套接字。不要关闭流,只需刷新对象输出流。并且在套接字的生命周期中使用相同的流,而不是每条消息的新流。
在客户端使用accept()
是一个矛盾。