Je suis un java.net.Exception socketexception: Connection reset erreur
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;
public class Server {
//ArrayList<PrintWriter> writers; //hold a list of current connections
Set<Socket> sockets = new HashSet<Socket>();
private ServerSocket serverSocket;
private Socket sock;
private static SimpleDateFormat date = new SimpleDateFormat(
"dd/mm/yyyy hh:mm:ss");
private static Calendar cal = Calendar.getInstance();
public static void main(String[] args) {
new Server().go();
}
public void go() {
try {
//setup port listener
//add connections to arraylist
//setup in and out streams
System.out.println("waiting connetion");
serverSocket = new ServerSocket(8999);
//writers = new ArrayList<PrintWriter>();
while (true) {
sock = serverSocket.accept();
sockets.add(sock);
//PrintWriter writer = new PrintWriter(
//sock.getOutputStream());
//writers.add(writer);
Thread t = new Thread(new ClientHandler(sock));
t.start();
System.out.println("connected");
}
} catch (IOException ex) {
ex.printStackTrace();
System.out.println("fail setup network");
} finally {
System.out.println("finally");
}
}
class ClientHandler implements Runnable {
private BufferedReader in;
public ClientHandler(Socket sock) {
//setup a client connection
try {
in = new BufferedReader(new InputStreamReader(
sock.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
System.out.println("fail classhandler");
}
}
@Override
public void run() {
//receive and relay messages back to clients
String message;
try {
while ((message = in.readLine()) != null) {
shout(message);
System.out.println("client says : "
+ date.format(cal.getTime()) + message);
}
} catch (IOException ex) {
try {
System.out.println("closing");
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
sockets.remove(sock);
System.out.println(sockets);
ex.printStackTrace();
System.out.println("fail read message");
}
}
public synchronized void shout(String message) {
//send message to all clients
//for (PrintWriter writer : writers) {
//writer.println(date.format(cal.getTime()) + " " + message
//+ "\n");
//writer.flush();
//}
for (Socket sock : sockets) {
try {
PrintWriter writer = new PrintWriter(sock.getOutputStream());
writer.println(date.format(cal.getTime()) + " " + message
+ "\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
=======================================================
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Client {
private JTextArea tArea;
private BufferedReader in;
private Socket sock;
private PrintWriter out;
public static void main(String[] args) {
new Client().go();
}
public void go() {
JFrame frame = new JFrame("Chat Client");
final JTextField tField = new JTextField(25);
tArea = new JTextArea(30, 20);
JButton button = new JButton("send");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
sendMessage(tField.getText());
tField.setText("");
}
});
frame.setSize(300, 500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(tArea, BorderLayout.NORTH);
frame.add(tField, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.pack();
setupNetwork();
Thread t = new Thread(new IncomingReader());
t.start();
}
public void setupNetwork() {
try {
sock = new Socket("localhost", 8999);
in = new BufferedReader(
new InputStreamReader(sock.getInputStream()));
out = new PrintWriter(sock.getOutputStream());
} catch (IOException ex) {
ex.printStackTrace();
System.out.println("fail networking");
}
}
class IncomingReader implements Runnable {
public void run() {
//receive messages from server
try {
String message = null;
while ((message = in.readLine()) != null) {
tArea.append(message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("fail incoming reader");
}
}
}
public void sendMessage(String message) {
try {
out.println(message);
out.flush();
} catch (Exception e) {
e.printStackTrace();
System.out.println("fail send message");
}
}
}
quand je ferme un client, j'obtiens cette erreur et j'ai essayé des choses avec la fermeture de mon connexions mais finalement, je ne suis pas sûr de la façon de se débarrasser de cette erreur:
fail read message
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Server$ClassHandler.run(Server.java:63)
at java.lang.Thread.run(Unknown Source)
Je sais que c'est parce que je suis la fermeture d'une connexion, mais il continue à jeter de cette erreur et c'est agaçant, même si elle ne casse pas mon serveur.
- Ce n'est pas une solution à vos problèmes mais je suggère que vous devriez utiliser Apache Mina pour faire ce genre de choses. Parce que ces bibliothèque gère faible niveau de maintenance sur son propre et de l'application peut se concentrer sur l'écriture de la logique.
Vous devez vous connecter pour publier un commentaire.
La cause habituelle de ce que vous avez écrit pour une connexion qui a déjà été fermé par l'autre extrémité. En d'autres termes, un protocole d'application d'erreur.
Le problème ici est que lorsque vous obtenez
null
dereadLine()
dans le serveur, vous devez fermer cette prise et retirez le correspondantWriter
à partir du tableau de écrivains à crier à.C'est parce que vous devez fermer correctement le support lorsque vous avez terminé avec elle sur le client. Je ne suis pas un SWING de gourou, mais ressemble WindowListener est ce que vous avez besoin. Il suffit de fermer la connexion lorsque la fenêtre principale est fermée.
EDIT: Lorsque vous fermez socket TCP, il y a un peu de travail doivent être faites: http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination. Lorsque vous fermez le programme, ce n'est pas qui va se passer. OS va fermer la connexion pour vous et permettra de libérer toutes les ressources associées, mais le serveur ne sera pas notifié sur le client de la fermeture de la connexion.
EDIT 2: Démonstration
Serveur:
Client:
mettre
socketname.close()
méthode dans votre client...le problème est que le client obtient fini avant le serveur est capable de lire des flux d'elle...À dire le code java que tous HTTP demande doit être acheminée à travers l'utilisation d'un proxy ci-dessous l'extrait de code:
Le Système.setProperty définit l'hôte proxy et le port. L'Authentificateur devrait être votre entreprise nom d'utilisateur et mot de passe. Cela devrait fonctionner maintenant.