title: keeping a java socket open?
body: <p>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 <code>version.txt</code> and that provides the version number (default 0.0.1) and sends it to the server. the server does recieve the version, and will <code>System.out.println();</code> 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 <code>NPS Game.txt</code> (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 <code>socket.setKeepAlive(true);</code> but that didnt change anything (i put that on both the client and the server). here is the code: </p>
  
  <p>server:</p>
  
  <pre><code>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();
  }
  }
  </code></pre>
  
  <p>server thread:</p>
  
  <pre><code>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);
  }
  }
  </code></pre>
  
  <p>and the client/updater:</p>
  
  <pre><code>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 &gt;= 0)
              current += bytesRead;
      } while (bytesRead &gt; -1);
  
      buffOutStream.write(byteArray, 0, current);
      buffOutStream.flush();
      buffOutStream.close();
      inStream.close();
      socket.close();
  }
  
  public static void showmsg(String s) {
      JOptionPane.showMessageDialog(null, s);
  }
  }
  </code></pre>
  
  <p>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 <code>socket.setKeepAlive(true);</code>. also, i thought it might be of note, in the server thread, right above the line <code>BufferedInputStream bis = new BufferedInputStream(fis);</code>, i put <code>System.out.println(socket.isClosed);</code> and it returned true. thats all i have. thanks in advance!</p>