Java Socket Server не получает сообщения? - PullRequest
0 голосов
/ 20 марта 2012

Хорошо, поэтому я не уверен, действительно ли произошла ошибка или нет.Я создал сервер прослушивания с использованием Java и NetBeans и пытаюсь заставить протокол работать.Однако по какой-то причине он не хочет принимать входящие сообщения.Он будет принимать входящие соединения и настраивать объект, используемый для обработки клиента, но просто не получит никаких сообщений.

Я не уверен, что происходит, я делаю что-то не так?Кроме того, у меня уже есть переадресованный порт 7777, и я провожу тестирование с использованием "127.0.0.1".

=====================================================================

В настоящее время у меня есть 3 класса:

Основной класс, GMServer:

public class GMServer {
public static void main(String[] args) throws IOException {
    CreateListener createListener = new CreateListener("USA Server East",7777,500);
    }
}

=======================================================================

Класс CreateListener:

public final class CreateListener {
private ServerSocket listenSocket = null;
private String serverName = "";
private int serverPort = 7777;
private int serverMax = 500;
private boolean terminate = false;
private double connectID = 0;
private String currentUser = "-1";
private listenParser[] connections;
private int listenArray = 0;
public listenParser[] users;
public int usercount;
private boolean listenerConnected = true;

public double getCID() {
    this.connectID++;
    return this.connectID;
    }

public CreateListener(String sName, int sPort, int sMax) throws IOException {
    //Set the server name, port, and max users.

    this.serverName = sName; this.serverPort = sPort; this.serverMax = sMax;

    //Try to create a listener socket.
    try { this.listenSocket = new ServerSocket(this.serverPort); } //If not successful, output error and end program.
    catch (IOException e) { System.err.println("Could not create a listening server on port "+this.serverPort); System.exit(7777); }

    //Let the console know that the listening server was created successfully.
    System.out.println("Creating Server: \""+serverName+"\" On Port "+serverPort+"...");

    while(listenerConnected) {
        try {
            Socket accepted = this.listenSocket.accept();
            new listenParser(accepted,getCID(),sMax).start();
            } catch (IOException e) {
            //Socket Wasn't Accepted?
            }
        }

    //Close down server after anything should cause the constant loop to end.
    listenSocket.close();
    }
}

==================================================================================

, а затемКласс listenParser (где он должен обрабатывать весь трафик от клиентов):

public class listenParser extends Thread {
public Socket[] global_sockets;
public int connections = 0;
private PrintWriter _out = null;
private BufferedReader _in = null;
private double cid = 0;
private Socket socket = null;
private String currentUser = "";
private int timeout = 0;
private boolean connectionOpen = true;
private int socketTimeout = 0;
private int socketTimeoutMax = 1000;

private String room = "";
private long x = 0;
private long y = 0;

public listenParser(Socket sock, double acID, int maxUsers) {
    super("listenParser");
    this.socket = sock;
    System.out.println("Connected To A Client...");
    }

public String readString(BufferedReader tmpBuffer) {
    try {
        return tmpBuffer.readLine();
        } catch (IOException e) {
        return "";
        }
    }

public String protocol(String arg) {
    String RETURN = "";
    switch(arg) {
        case "login": currentUser = "1"; break;
        case "echo": this._out.println(readString(this._in)); break;
        default: /*Do Nothing*/ break;
        }

    //Only allow access to these commands if the user is logged in.
    if (currentUser!="") {
        switch(arg) {
            default: break;
            }
        }
    return RETURN;
    }

public boolean good() {
    if (this.currentUser.equals("")) {
        return false;
        }
    return true;
    }

@Override
public void run() {
    try {
        _out = new PrintWriter(socket.getOutputStream(),true);
        _in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        connections++; if (connections>500) { connectionOpen = false; }

        while(connectionOpen) {
            try {
                String arguments, reply;

                arguments = this._in.readLine();

                reply = protocol(arguments);

                socketTimeout = 0;
                } catch (IOException e) {
                socketTimeout++;
                if (socketTimeout>socketTimeoutMax) {
                    connectionOpen = false; break;
                    }
                }
            }

        _out.close();
        _in.close();
        socket.close();

        System.out.println("Client Disconnected...");
        } catch (IOException e) {
        e.printStackTrace();
        }
    }
}

1 Ответ

2 голосов
/ 20 марта 2012

Вы читаете строки. Вы отправляете строки? Очень распространенная ошибка. readLine() будет блокироваться, пока не получит символ новой строки или EOS.

Говоря о EOS, первое, что вы должны сделать с результатом readLine(), это проверить его на ноль, и если это так, закройте сокет и вырвитесь из цикла чтения.

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