2012-03-19 7 views
0

申し訳ありませんが、実際にエラーがあるかどうかはわかりません。 JavaとNetBeansを使用してリスニングサーバを作成しましたが、プロトコルを動作させようとしています。 しかし何らかの理由で受信メッセージを受け入れたくありません。 受信接続を受け入れ、クライアントの処理に使用するオブジェクトを設定しますが、メッセージを受け取ることはありません。私は何が起こっているのかわからないんだけどJavaソケットサーバーはメッセージを受信しませんか?

は、私が何か間違ったことをやっていますか?また、私はすでにポート7777ポートを転送しており、 "127.0.0.1"を使ってテストしています。

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

メインクラス、GMServer:

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

私は現在、3つのクラスを持っています

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

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

クライアントコードとサンプルログをサーバーとクライアントから提供する必要があります。 –

+2

何が起きているのかを確認するために、いくつかの 'print'ステートメントでコードをインストールするか、デバッガを使用することをお勧めします。 –

答えて

2

あなたは行を読んでいます。 行ですか?非常に一般的な間違い。 readLine()は改行またはEOSを受信するまでブロックします。

EOSについて言えば、まずreadLine()の結果で行う必要があることはnullをチェックし、そうであればソケットを閉じて読み取りループから抜け出すことです。

+0

これは多くの助けをした。 –

関連する問題