0

I am new to Socket programming.I want to send an Object of class Person to the server using Sockets. There is an exception of Server Socket.
Class person is as follows:

import java.awt.Image;
import java.io.Serializable;


public class Person implements Serializable {

    private String name;
    private String id;

    public Person() {}
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    public Person(String name, String id) {
        super();
        this.name = name;
        this.id = id;
    }

}

I first run my server . The server code is as follows:

import java.io.*;    
import java.net.*;
public class Server extends Thread {
    ServerSocket serverSocket;
    Socket socket;
    ObjectInputStream inStream=null;
    ObjectOutputStream outStream=null;

    public void run(){
        try{
            serverSocket=new ServerSocket(2004);
            socket=serverSocket.accept();
            this.outStream=new ObjectOutputStream(socket.getOutputStream());
            outStream.flush();
            this.inStream=new ObjectInputStream(socket.getInputStream());
            while(true){
                System.out.println("recieving  data");
                Person person=(Person)this.inStream.readObject();
                //queue.put(person);
                System.out.println(person.getName()+"  "+person.getId());
            }

        }
        catch(EOFException e){
        }
        catch(IOException e){
            e.printStackTrace();
        }
        catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    public static void main(String args[]){
        new Server().start();
    }
}

Then I run my client. Its code is as follows.

import java.io.*;
import javax.swing.*;
import javax.swing.JLabel;
import javax.swing.tree.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.util.LinkedList;
public class Client {
    Socket socket;

    ObjectInputStream inStream=null;
    ObjectOutputStream outStream=null;
    String ip="localhost";  
    boolean connected=false;
    public Client(String ip){
            this.ip=ip;
    }
    public Client(){
    }
    public static void main(String args[]){
        new Client().connect();
    }

    public boolean connect(){
        try {
            socket = new Socket(ip, 2004);
            System.out.println("Client starting");
            this.outStream=new ObjectOutputStream(socket.getOutputStream());
            outStream.flush();
            this.inStream=new ObjectInputStream(socket.getInputStream());
            String name;
            System.out.println("sending data");
            outStream.writeObject(new Person("faisal ","232323"));

        }catch(EOFException e){
            JOptionPane.showMessageDialog(null,"EOFException");
            System.out.println("I am inside Connector EOFException"); 
            connected=false;
            //System.out.println("PoolRunner Client side Disconnected");
        }
        catch (IOException e) {
            JOptionPane.showMessageDialog(null, "IOException");
            System.out.println("I am inside Connector IOException");
            System.out.println(e);
            connected=false;
        }

        finally{
            return(connected);
        }
    }

    public ObjectInputStream getObjectInputStream(){
        return this.inStream;
    }
    public ObjectOutputStream getObjectOutputStream(){
        return this.outStream;
    }
    public void disconnect(){
        try{
            this.inStream.close();
            this.outStream.close();
            this.socket.close();
        }catch(IOException e){
            JOptionPane.showMessageDialog(null,"Problem in closing streams or socket");
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(null,"Problem in closing streams or socket");
            e.printStackTrace();
        }
    }
}

Following Exception is thrown at the server side.

java.net.SocketException: Connection reset
5
  • 1
    Could you provide the stack trace (or at least which line on the server that exception was thrown at)? Also, has the server printed any objects/receiving data/etc.? Commented Sep 1, 2015 at 20:53
  • That is probably because the client closes the connection and your server is still trying to read from the input stream. Commented Sep 1, 2015 at 20:53
  • actually he never closed the connections... Commented Sep 1, 2015 at 20:57
  • @QuakeCore The client program will exit after it writes the object but the server will keep reading because it uses an infinite loop. Commented Sep 1, 2015 at 20:59
  • lol i have an answer but no matter what i do i cant post it due to formatting issue Commented Sep 1, 2015 at 21:36

3 Answers 3

1

well your code had some flaws in it, such as not closing the connections, misplaced while loops, you know the usual stuff :)

Server.java

import java.io.*;
import java.net.*;

public class Server extends Thread {
    ServerSocket serverSocket;
    Socket socket;
    ObjectInputStream inStream = null;
    ObjectOutputStream outStream = null;

    public Server() {
    }

    public void run() {
        try {
            serverSocket = new ServerSocket(2004);
            while (true) {
                socket = serverSocket.accept();
                this.outStream = new ObjectOutputStream(
                        socket.getOutputStream());
                outStream.flush();
                this.inStream = new ObjectInputStream(socket.getInputStream());

                System.out.println("recieving  data");

                Person person = (Person) this.inStream.readObject();
                // queue.put(person);
                System.out.println(person.getName() + "  " + person.getId());
            }

        }

        catch (EOFException e) {

        } catch (IOException e) {
            e.printStackTrace();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();

        }

    }

    public static void main(String args[]) {
        new Server().start();

    }
}

Client.java

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import javax.swing.JOptionPane;

public class Client {
    Socket socket;

    ObjectInputStream inStream = null;
    ObjectOutputStream outStream = null;
    String ip = "localhost";
    boolean connected = false;

    public Client(String ip) {
        this.ip = ip;
    }

    public Client() {
    }

    public static void main(String args[]) {
        new Client().connect();
    }

    public void connect() {
        try {
            socket = new Socket(ip, 2004);
            System.out.println("Client starting");
            this.outStream = new ObjectOutputStream(socket.getOutputStream());
            connected = true;

            String name;
            System.out.println("sending data");
            outStream.writeObject(new Person("faisal ", "232323"));
            outStream.flush();
        } catch (EOFException e) {
            JOptionPane.showMessageDialog(null, "EOFException");
            System.out.println("I am inside Connector EOFException");
            connected = false;
            // System.out.println("PoolRunner Client side Disconnected");
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "IOException");
            System.out.println("I am inside Connector IOException");
            System.out.println(e);
            connected = false;
        }

        finally {
            if (connected) {
                disconnect();
            }
        }
    }

    public ObjectOutputStream getObjectOutputStream() {
        return this.outStream;
    }

    public void disconnect() {
        try {
            this.outStream.close();
            this.socket.close();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null,
                    "Problem in closing streams or socket");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                    "Problem in closing streams or socket");
            e.printStackTrace();
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

hahahaha, posting the answer took me more time that figuring out the answer, Crazy Formatters!
0

Your client doesn't do anything with the socket after sending the object, it just quits. If you don't close a connection properly before ending the process, the operating system gets confused and will just reset the connection.

You'll need to call shutdownOutput() and close() on the socket.

See also purpose of socket.shutdownOutput()

1 Comment

Yes you are absolutely right! I have fixed the error
0

In Client.java, change main to the following:

public static void main(String args[]){
    Client cl = new Client();
    cl.connect();
    cl.disconnect();
}

This makes your client close its connections to the server before closing. This helps prevent the OS from resetting the connection as mentioned by escitalopram

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.