2012-12-05 77 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

没问题,很高兴帮助:) –

相关问题