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");
}
}
}
when I close a client I get this error and I tried somethings with closing my connections but ultimately I am not sure how to get rid of this error:
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)
I know its because I am closing a connection but it keeps throwing this error and its annoying even though it doesn't break my server.
The usual cause of this is that you have written to a connection that has already been closed by the other end. In other words, an application protocol error.
The specific problem here is that when you get null from readLine() in the server, you should close that socket and remove the corresponding Writer from the array of writers to shout at.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With