2012-12-05 54 views
2

我正在製作一個會自動更新的程序/遊戲。我有更新部分,但沒有檢查版本。我會認爲這很容易。繼承人我做了什麼。我爲遊戲寫了一個更新版本,並且我編寫了一個服務器。每次客戶端/更新程序連接時服務器都會啓動一個線程。線程處理一切。遊戲更新程序會讀取一個名爲version.txt的文件並提供版本號(默認爲0.0.1)並將其發送到服務器。服務器確實收到版本,並且如果版本匹配,將會System.out.println();,如果我更改版本,它會更改輸出。以便部分工作。但這是遠遠不夠的。該過程的第二部分是服務器然後發送一個名爲NPS Game.txt(它發送任何內容,但txt很容易測試)的文本文件,客戶端用剛剛發送的新文件替換該文件的舊版本。問題是我不斷收到一個錯誤,說Socket被關閉了。我試過使用socket.setKeepAlive(true);但這並沒有改變任何東西(我把它放在客戶端和服務器上)。這裏是代碼:保持java套接字打開?

服務器:

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(); 
} 
} 

服務器線程:

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); 
} 
} 

和客戶端/更新:

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); 
} 
} 

我不知道有什麼不對的地方,但這真的令人沮喪。如果任何人都可以幫助,這將不勝感激。有些事情我做完了:谷歌各種問題,試圖執行socket.setKeepAlive(true);。另外,我認爲它可能是值得注意的,在服務器線程中,在線BufferedInputStream bis = new BufferedInputStream(fis);的正上方,我把System.out.println(socket.isClosed);,它返回true。這就是我的全部。提前致謝!

回答

6

我認爲關閉兩個流之一,關閉套接字。因此,請嘗試從服務器端的getVersion()方法中刪除ois.close()調用。也可以在客戶端撥打sendVersion()方法中的oos.close()電話。

當你構造一個ObjectOutputStream或者ObjectInputStream並且你完成了它的時候,你不應該關閉那個流,因爲它會關閉底層的流,這就是你的套接字。

+0

我打電話給shananagans。但是,它的工作。那真的很容易,現在我知道不要這樣做!謝啦! – PulsePanda

+0

我會盡快接受 – PulsePanda

+0

沒問題,很高興幫助:) –

相關問題