estoy haciendo un programa o juego que se actualiza de forma automática. tengo la actualización de la parte de abajo, pero no la comprobación de la versión. yo habría pensado que sería bastante fácil. heres lo que he hecho. escribí una actualización para el juego, y me escribió un servidor. el servidor se inicia un hilo cada vez que un cliente/updater se conecta. el hilo se encarga de todo. el juego updater lee un archivo llamado version.txt y que proporciona el número de versión (por defecto la versión 0.0.1) y la envía al servidor. el servidor recibe la versión, y se System.out.println(); si la versión de los partidos, y si puedo cambiar la versión, los cambios de la salida. de modo que parte de las obras. pero que es la medida de como va. la segunda parte del proceso es que el servidor, a continuación, envía simplemente un archivo de texto llamado NPS Game.txt (envía nada, pero txt fue fácil para probar) y el cliente sustituye a la antigua versión de este archivo con la nueva que acaba de enviar. el problema es que me sale un error que dice que el Socket se cierra. he intentado usar socket.setKeepAlive(true);, pero que no cambia nada (que me ponga en el cliente y en el servidor). aquí está el código:

servidor:

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

servidor hilo:

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

y el cliente/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);
}
}

no sé qué hay de malo en ello, pero es realmente frusturating. si alguien puede ayudar, se agradece. algunas de las cosas que he hecho: google todo tipo de preguntas, trató de implementar socket.setKeepAlive(true);. además, pensé que podría ser de la nota, en el servidor de hilo, justo encima de la línea de BufferedInputStream bis = new BufferedInputStream(fis);, puse System.out.println(socket.isClosed); y devuelve true. eso es todo lo que tengo. gracias de antemano!

InformationsquelleAutor PulsePanda | 2012-12-05

1 Comentario

  1. 6

    Creo que el cierre de una de las dos secuencias, cierra el socket. Así que trata de eliminar la ois.close() llamar su getVersion() método en el lado del servidor. También deshacerse de la oos.close() de llamada en tu sendVersion() método en el lado del cliente.

    Cuando se construye un ObjectOutputStream o ObjectInputStream y que haya terminado con él, usted no debería cerrar esa corriente, porque se va a cerrar la secuencia subyacente, que es en su caso el zócalo.

    • yo llame shananagans. pero, funcionó. que fue muy fácil, y ahora no sé que hacer eso! gracias hombre!
    • voy a aceptar tan pronto como pueda
    • No hay problema, me alegro de ayudar 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here