keeping a java socket open?

14,507

I think that closing one of both streams, closes the socket. So try to remove the ois.close() call out of your getVersion() method at the server side. Also get rid of the oos.close() call in your sendVersion() method at the client side.

When you construct an ObjectOutputStream or ObjectInputStream and you are done with it, you shouldn't close that stream, because it will close the underlying stream, which is in your case the socket.

Share:
14,507
PulsePanda
Author by

PulsePanda

Im kinda a noob when it comes to programming, but i'm better than a lot of people i know. i love java with a passion, but i dont know much about it.

Updated on June 04, 2022

Comments

  • PulsePanda
    PulsePanda almost 2 years

    i'm making a program/game that will update automatically. i have the update part down, but not the checking of the version. i would have thought that it'd be pretty easy. heres what i've done. i wrote an updater for the game, and i wrote a server. the server starts a thread every time a client/updater connects. the thread handles everything. the game updater reads a file called version.txt and that provides the version number (default 0.0.1) and sends it to the server. the server does recieve the version, and will System.out.println(); if the version matches, and if i change the version, it changes the output. so that part works. but that is as far as it goes. the second part of the process is that the server then sends just a text file called NPS Game.txt (it sends anything, but txt was easy to test with) and the client replaces the old version of this file with the new one that just sent. the problem is that i keep getting an error that says the Socket is closed. i've tried using socket.setKeepAlive(true); but that didnt change anything (i put that on both the client and the server). here is the code:

    server:

    package main;
    
    import java.io.*;
    import java.net.*;
    
    import javax.swing.JOptionPane;
    
    public class Server {
    static ServerSocket serverSocket = null;
    static Socket clientSocket = null;
    static boolean listening = true;
    
    public static void main(String[] args) throws IOException {
        try {
            serverSocket = new ServerSocket(6987);
        } catch (IOException e) {
            ServerThread.showmsg("Could not use port: 6987");
            System.exit(-1);
        }
    
        ServerThread.showmsg("server- initialized");
        ServerThread.showmsg("server- waiting...");
    
        while (listening)
            new ServerThread(serverSocket.accept()).start();
    }
    }
    

    server thread:

    package main;
    
    import java.io.*;
    import java.net.Socket;
    import java.net.SocketException;
    
    import javax.swing.JOptionPane;
    
    public class ServerThread extends Thread {
    Socket socket;
    ObjectInputStream in;
    ObjectOutputStream out;
    String version = "0.0.1";
    
    public ServerThread(Socket socket) {
        super("Server Thread");
        this.socket = socket;
    }
    
    public void run() {
        showmsg("server- Accepted connection : " + socket);
        getVersion();
        sendFile();
    }
    
    public void getVersion() {
        try {
            ObjectInputStream ois = new ObjectInputStream(
                    socket.getInputStream());
            try {
                String s = (String) ois.readObject();
                if (s.equals(version)) {
                    System.out.println("server- matched version :)");
                } else {
                    System.out.println("server- didnt match version :(");
                    System.exit(0);
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            ois.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void sendFile() {
        // sendfile
        File myFile = new File("C:\\Programming\\NPS\\Files\\bin\\NPS Game.txt");
        byte[] mybytearray = new byte[(int) myFile.length()];
        FileInputStream fis;
        try {
            fis = new FileInputStream(myFile);
            BufferedInputStream bis = new BufferedInputStream(fis);
            bis.read(mybytearray, 0, mybytearray.length);
            OutputStream os = socket.getOutputStream();
            showmsg("server- Sending...");
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            socket.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void showmsg(String s) {
        JOptionPane.showMessageDialog(null, s);
    }
    }
    

    and the client/updater:

    package main;
    
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import javax.swing.JOptionPane;
    
    import org.omg.CORBA.portable.InputStream;
    
    public class Connections {
    String IP, port;
    String message = "";
    Socket socket;
    
    public Connections(boolean server, boolean updating, String IP, String port) {
        this.IP = IP;
        this.port = port;
        try {
            socket = new Socket(IP, Integer.parseInt(port));
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        if (!server) {
            if (updating) {
                try {
                    sendVersion();
                    updating();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                client();
            }
        }
        if (server) {
    
        }
    }
    
    public void sendVersion() throws IOException {
    
        FileReader fileReader = new FileReader(
                "C:\\Program Files\\AVTECH\\NPS\\Files\\bin\\version.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
    
        String stringRead = bufferedReader.readLine();
    
        bufferedReader.close();
    
        ObjectOutputStream oos = new ObjectOutputStream(
                socket.getOutputStream());
        oos.writeObject(stringRead);
        oos.flush();
        oos.close();
    }
    
    public void updating() throws IOException {
        int filesize = 6022386; // filesize temporary hardcoded
    
        int bytesRead;
        int current = 0;
    
        showmsg("client- connected");
    
        // receive file
        byte[] byteArray = new byte[filesize];
        java.io.InputStream inStream = socket.getInputStream();
        FileOutputStream fileOutStream = new FileOutputStream(
                "C:\\Program Files\\AVTECH\\NPS\\Files\\bin\\NPS Game.txt");
        BufferedOutputStream buffOutStream = new BufferedOutputStream(
                fileOutStream);
        bytesRead = inStream.read(byteArray, 0, byteArray.length);
        current = bytesRead;
    
        do {
            bytesRead = inStream.read(byteArray, current,
                    (byteArray.length - current));
            if (bytesRead >= 0)
                current += bytesRead;
        } while (bytesRead > -1);
    
        buffOutStream.write(byteArray, 0, current);
        buffOutStream.flush();
        buffOutStream.close();
        inStream.close();
        socket.close();
    }
    
    public static void showmsg(String s) {
        JOptionPane.showMessageDialog(null, s);
    }
    }
    

    i dont know what's wrong with it, but it is really frusturating. if anyone can help, it would be appreciated. some things ive done: google all kinds of questions, tried implementing socket.setKeepAlive(true);. also, i thought it might be of note, in the server thread, right above the line BufferedInputStream bis = new BufferedInputStream(fis);, i put System.out.println(socket.isClosed); and it returned true. thats all i have. thanks in advance!