2012-03-19 128 views
0

好的,所以我不确定是否真的有错误。 我创建了一个使用Java和NetBeans的监听服务器,并试图让协议工作。 但是,由于某种原因,它不想接受传入的消息。 它会接受传入连接并设置用于处理客户端的对象,但不会收到任何消息。Java Socket服务器不接收消息?

我不确定发生了什么,我做错了什么?此外,我已经有端口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(); 
     } 
    } 
} 
+0

猜测,您需要提供来自服务器和客户端的客户端代码和示例日志 – 2012-03-19 20:35:28

+2

我建议用一些'print'语句来检查代码,看看发生了什么,或者使用调试器。 – 2012-03-19 20:38:53

回答

2

您正在阅读各行。您是发送行吗?非常常见的错误。 readLine()将阻塞,直到收到换行符或EOS。

说到EOS,你必须要做的第一件事情就是readLine()的结果是检查它是否为空,如果是的话关闭套接字并跳出读取循环。

+0

这很有帮助,谢谢。 – 2012-03-20 01:42:21

相关问题