Je crée un prototype de serveur client & afin que je puisse comprendre comment gérer les reconnexions. Le serveur doit créer une socket de serveur et écouter pour toujours. Un client peut se connecter, envoyer ses données, et fermer son socket, mais il n'enverra pas de message de type "I'm done and closing" au serveur. Pour cette raison, le serveur obtient un EOFException
lorsqu'il exécute un readByte()
depuis la fermeture du client distant. Dans le gestionnaire d'erreurs pour le EOFException
, il fermera le socket et en ouvrira un nouveau.Java: la reconnexion sur un socket donne parfois une erreur
Voici le problème: Le client obtient parfois un SocketWriteError
quand il fait l'appel outputStream.write()
même après son ouverture avec succès la prise/inputstream/outpustream. Cela peut avoir quelque chose à voir avec la fréquence d'ouverture et de fermeture de ces sockets. Une chose intéressante est que le client fait un nombre arbitraire d'écritures/ferme/reconnecte avant de se séparer. Il va parfois conner sur la première reconnexion, d'autres fois il faudra 50 reconnecter avant de voir le SocketWriteError
.
est ici l'erreur sur le côté client:
java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at bytebuffertest.Client.main(Client.java:37)
Voici quelques extraits de code:
SERVEUR:
public static void main(String[] args)
{
Server x = new Server();
x.initialize();
}
private void initialize()
{
ServerSocket s;
InputStream is;
DataInputStream dis;
while (true) //ADDED THIS!!!!!!!!!!!!!!!!!!!!!!
{
try
{
s = new ServerSocket(4448);
s.setSoTimeout(0);
s.setReuseAddress(true);
is = s.accept().getInputStream();
System.out.println("accepted client");
dis = new DataInputStream(is);
try
{
byte input = dis.readByte();
System.out.println("read: " + input);
} catch (Exception ex)
{
System.out.println("Exception");
dis.close();
is.close();
s.close();
}
} catch (IOException ex)
{
System.out.println("ioexception");
}
}
}
CLIENT:
public static void main(String[] args)
{
Socket s;
OutputStream os;
try
{
s = new Socket("localhost", 4448);
s.setKeepAlive(true);
s.setReuseAddress(true);
os = s.getOutputStream();
int counter = 0;
while (true)
{
try
{
os.write((byte) counter++);
os.flush();
os.close();
s.close();
s = new Socket("localhost", 4448);
s.setKeepAlive(true);
s.setReuseAddress(true);
os = s.getOutputStream();
} catch (Exception e)
{
e.printStackTrace();
System.err.println("ERROR: reconnecting...");
}
}
} catch (Exception ex)
{
ex.printStackTrace();
System.err.println("ERROR: could not connect");
}
}
Est-ce que quelqu'un savoir comment correctement reconnecter?
Oui, je crois que c'est la réponse. Je vous remercie! – jbu