【问题标题】:keeping a java socket open?保持Java套接字打开?
【发布时间】:2012-11-23 13:23:19
【问题描述】:

我正在制作一个会自动更新的程序/游戏。我有更新部分,但没有检查版本。我原以为这很容易。这就是我所做的。我为游戏写了一个更新程序,我写了一个服务器。每次客户端/更新程序连接时,服务器都会启动一个线程。线程处理一切。游戏更新程序读取一个名为version.txt 的文件,该文件提供版本号(默认为 0.0.1)并将其发送到服务器。服务器确实收到了版本,如果版本匹配,它将System.out.println();,如果我更改版本,它会更改输出。所以这部分工作。但仅此而已。该过程的第二部分是服务器然后只发送一个名为 NPS Game.txt 的文本文件(它发送任何内容,但 txt 很容易测试),客户端用刚刚发送的新文件替换这个文件的旧版本.问题是我不断收到一个错误,说套接字已关闭。我试过使用socket.setKeepAlive(true);,但这并没有改变任何东西(我把它放在客户端和服务器上)。这是代码:

服务器:

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。这就是我的全部。提前致谢!

【问题讨论】:

    标签: java sockets input io output


    【解决方案1】:

    我认为关闭两个流之一会关闭套接字。因此,请尝试从服务器端的 getVersion() 方法中删除 ois.close() 调用。还要在客户端的sendVersion() 方法中去掉oos.close() 调用。

    当您构造一个 ObjectOutputStream 或 ObjectInputStream 并完成它时,您不应该关闭该流,因为它会关闭底层流,在您的情况下是套接字。

    【讨论】:

    • 我打电话给shananagans。但是,它奏效了。这真的很容易,现在我知道不要那样做!谢谢大哥!
    • 没问题,很高兴为您提供帮助:)
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多