What I'm trying to do
A client/server application:
The client opens a GUI with a button "Read".
Clicking it it will open a new frame with some articles to read. At this stage a short String
.
Abstract:
What I tried
At this current stage of development I'm stuck with this error message:
Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
This is the server-class:
public class StartServer {
public static void main(String[] argv) throws Exception {
@
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("Server started");
while (true) {
List<String> receive = new ArrayList<String>();
// Wait for client to connect
Socket aNewClientSocket = serverSocket.accept();
System.out.println("Server-Client connexion established!!");
ObjectInputStream toReceiveFromClient = new ObjectInputStream(aNewClientSocket.getInputStream());
receive = (List<String>) toReceiveFromClient.readObject();
System.out.println(aNewClientSocket.getLocalPort());
System.out.println(aNewClientSocket.getInetAddress());
switch (receive.get(0)) {
case "Reader button click":
List<Object> toSend = new ArrayList<Object>();
Article a=new Article();
a.setTitle("New Title");
toSend.add(a);
ObjectOutputStream objectWayToSend = new ObjectOutputStream(aNewClientSocket.getOutputStream());
objectWayToSend.writeObject(toSend);
objectWayToSend.flush();
default:
throw new IllegalArgumentException("Bad request from client!!");
}
The clients relevant method:
public void sendToServer(List<String> toSend) throws UnknownHostException, IOException {
try {
Socket socket = new Socket("localhost", 9999);
ObjectOutputStream objectWayToSend = new ObjectOutputStream(socket.getOutputStream());
objectWayToSend.writeObject(toSend);
objectWayToSend.flush();
objectWayToSend.close();
}
catch(Exception e) {
JOptionPane.showMessageDialog(frame, "The server is offline or connection can't be establish!");
}
}
@SuppressWarnings("unchecked")
public List<Object> receiveFromServer() throws UnknownHostException, IOException {
List<Object> receive = new ArrayList<Object>();
try {
Socket socket = new Socket("localhost", 9999);
ObjectInputStream objectToGet = new ObjectInputStream(socket.getInputStream());
receive=(List<Object>) objectToGet.readObject();
}
catch(Exception e) {
JOptionPane.showMessageDialog(frame, "The server is offline or connection can't be establish!");
}
return receive;
The referenced button in the GUI
btnCiteste = new JButton("Read");
btnCiteste.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
List<String> toSend = new ArrayList<String>();
toSend.add("Read");
try {
sendToServer(toSend);
List<Object> received= receiveFromServer();
//new ArticoleReaderFrame ();
} catch (IOException e) {
e.printStackTrace();
}
}
});
You close the OutputStream
in the client after you finished sending but before you started receiving. That's the cause of your problem, since closing the OutputStream
also closes the underlying Socket.
Referencing Official reasons for “Software caused connection abort: socket write error”