Сервер и Java-апплет: подключение сокета - PullRequest
0 голосов
/ 15 января 2012

У меня недавно прекратил работу Java-апплет после обновления сервера, а именно: 1. Сервер обновлен с Sun под управлением Solaris 9, 32-разрядная версия.(установлен в 2005 году) до CentOS 5, (linux) на 64 бит.2. Апплет имеет два основных класса: 1) collect.class: собирает данные с холста 2) server.class: прослушивает collect.class через PORT и действует соответственно;

, но апплет застрял, и япроверьте start_server.sh (который создает отчет nohup.out), есть строка

Exception creating server socket: java.net.BindException: Address already in use

Это странно, потому что PORT = 9999, который collect.class использует без проблем.Почему проблема возникает только в server.class (кто слушает collet.class).

Пожалуйста, помогите!

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

I.IN COLLECT.JAVA:Есть холст с сеткой, пользователь нарисует некоторую область на сетке и нажимает «Отправить».-> MineCanvas.submit () срабатывает -> Значение области вычисляется с помощью MineCanvas.ComputeGridValue () -> затем Collect.cleintSend (застрял здесь)

import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;

public class Collect extends Applet {

...
public static final int PORT = 8888;
...

public boolean action(Event e, Object arg) {
...
        if (arg.equals("Submit")) {
        if (action(null, "Update Grid")) {
            minecanvas.Submit();
        } else {
            return true;
        }
    }
    return true;
}
...
public void clientSend(){ 
    s = new Socket(this.getCodeBase().getHost(), PORT);
        in = new DataInputStream(s.getInputStream());}
            out = new DataOutputStream(s.getOutputStream());

            listener = new SolutionListener(in, minecanvas);}
        minecanvas.mode = MineCanvas.SUBMITTING;
    minecanvas.repaint();


    int n = 1;
    out.writeBytes(minecanvas.gridh + "\n" + minecanvas.gridw + "\n");

    for (int h = 0; h < minecanvas.gridh; h++) {
        for (int w = 0; w < minecanvas.gridw; w++) {
            out.writeBytes(n + " " + minecanvas.AllCells[w][h].net + "\n");
            n++;
        }
    }
    out.writeBytes("done\n");

        s = null;
        in = null;
    out = null;


}
}

class MineCanvas extends Canvas {
...
public int gridw = 0;                       // number of grid squares width-ly

public int gridh = 0;                       // number of grid squares height-ly

public GridCell[][] AllCells;                   // array of grid cells comprising the grid
...

// compute values for minecanvas 
public void ComputeGridValue() {...}    


public void Submit() {
    ComputeGridValue();
    parent.clientSend();
}

    ...

}
...

}

II.SERVER.JAVA

import java.io.*;
import java.net.*;

public class Server extends Thread {
private OPM_Server opm; // this is the corresponding server for collect
...
public Server() {
    ...
    opm = new OPM_Server();
}

public static void main(String[] args) {
    new Server();
}
}

...
// OPM: correspond to Collect
class OPM_Server extends Thread {
public final static int DEFAULT_PORT = 8888;
protected int port;
protected ServerSocket listen_socket;

public static void fail(Exception e, String msg) {
    System.err.println(msg + ": " + e);
    System.exit(1);
}

public OPM_Server() {
    this.port = DEFAULT_PORT;
    try { listen_socket = new ServerSocket(port); }
    catch (IOException e){ fail(e, "Exception creating server socket");}
    System.out.println("Server: listening on port " + port);
    this.start();
}

public void run() {
    try {
        while(true) {
            System.out.println("I got to before ServerSocket");
            Socket client_socket = listen_socket.accept();
            OPM_Connection c = new OPM_Connection(client_socket);
            }
        }
    catch (IOException e) {fail(e, "Exception while listening for connections");}
}
}
...
class OPM_Connection extends Thread {
protected Socket client;
protected BufferedReader in;
protected DataOutputStream out;
File mine_data = new File("mine_data");  // output file data 
FileOutputStream file_stream;
DataOutputStream file_out;

public OPM_Connection(Socket client_socket) {
    client = client_socket;
    try {

        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        out = new DataOutputStream(client.getOutputStream());
    } catch (IOException e) {
        try {
            client.close();
        } catch (IOException e2) {
        }
        ;
        System.err.println("Exception while getting socket stream: "
                + e.toString());
        return;
    }
    this.start();
}

public void run() {
    ...

    file_stream = new FileOutputStream(mine_data);
    file_out = new DataOutputStream(file_stream);
    ...// write to mine data

    file_out = null;
    if (inputGood == true) {
        System.out.println(pid + "> ---Got all info from client");
        Runtime r = Runtime.getRuntime();
        Process Aproc = null;
        Process Bproc = null;
        int returnVal = -1;
        try {
            Aproc = r.exec("runOPM");
        } catch (IOException e) {
            inputGood = false;
            System.out.println(pid + "> runOPM didn't exec");
        }
        try {
            returnVal = Aproc.waitFor();
        } catch (InterruptedException e) {
            inputGood = false;
            System.out.println(pid + "> runOPM didn't return");
        }
        System.out.println(pid + "> ---All execing done");

        File report = new File("mine_report");
        FileInputStream report_stream = null;
        ... 
        // create a mine report

        System.out.println(pid + "> ---Done sending data back to client");
    }
    try {
        client.close();
    } catch (IOException e2) {
    }
    ;
    System.out.println(pid + "> EXITING THREAD");
}
} 

1 Ответ

0 голосов
/ 15 января 2012

Исключительная ситуация при создании сокета сервера: java.net.BindException: Адрес уже используется

Это исключение означает, что номер порта, к которому пытается подключиться сокет (номер порта вашего сокетапытается использовать в локальном конце соединения) уже используется какой-либо другой программой.Чтобы это исправить, вам нужно либо выяснить, какое другое программное обеспечение использует порт, и посмотреть, можете ли вы смело изменить его, либо изменить порт, используемый вашей программой.

Редактировать: Возможно, стоит попытаться посмотретьдля редко используемых портов, чтобы уменьшить вероятность использования еще одного порта, который, как известно, используется некоторыми распространенными программами, вот список википедий типичных портов TCP и UDP, используемых общими программами и службами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...