0

我的程序的布局使得主应用程序可以向连接到它的任何节点发送命令。当节点收到请求时,它会返回响应并继续等待更多请求。

当应用程序运行时,节点成功回复了一个请求,当发送第二个请求时,节点将其视为空值或根本看不到它。为什么这种情况不断发生?

PS我希望与节点的连接保持打开状态,以便它可以接收更多请求。

请求发送代码:

public java.lang.String getTime(server.Node node){

    protocol.Message ms = new protocol.Message("<time>","");

    node.sendRequestToClient(ms);
    node.dos.flush();

    java.lang.System.out.println("Sent time request to " + node.ip);

    java.lang.String time = null;
    try {

        time = node.dis.readLine();


    } catch (java.io.IOException ex) {
        System.out.println("Could not read response.");
    }

    protocol.Message response = protocol.Message.parseDataToMessage(time);

    java.lang.String systime = response.getActionData();

    return systime;


}

响应发送代码:

public class Client {

public Client(NetworkConnection connection){


    this.connectionToServer = connection;

    try{
        connectionToServer.connect();
        responseOutStream = connectionToServer.getPrintWriter();
        requestInStream = connectionToServer.getBufferedReader();
    }catch(IOException ex){
        System.out.println("Could not connect to server." + ex.getMessage() + ex.toString());
    }



}

public void beginRequestListener(){

    String request;

    try {
        while((request = requestInStream.readLine())!=""){


            System.out.println("Recieved request: " + request + request.length());

            Message response = Message.parseDataToMessage(request);

            sendResponseToServer(response);
    }


    } catch (java.io.IOException ex) {
        System.out.println("Could not read request stream.");
    } catch(NullPointerException e){
        e.printStackTrace();
        e.getClass();
    }

}

public void sendResponseToServer(Message ms){

        protocol.Message response = MessageParser.compileResponse(ms);
        java.lang.System.out.println("Response to send: "+response);
        response.send(responseOutStream);



}



public BufferedReader requestInStream; 
public PrintWriter responseOutStream; 
public NetworkConnection connectionToServer;

}

消息解析器类:

public class MessageParser {



static public Message compileResponse(Message ms){

    Message response = null;

    switch(ms.getAction()){

        case "<time>":

            response = new Message("<time>", String.valueOf(System.currentTimeMillis()));
            break;

        case "<date>":

            SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
            Date date = new Date();
            sd.setTimeZone(TimeZone.getTimeZone("IST"));



            response = new Message("<date>", date.toString());
            break;    



        default:

            break;

    }
    return response;
}

}

堆栈跟踪和输出:

Recieved request: <action><time><action><actionData><actionData>
Response to send: <action><time><action><actionData>1370380854566<actionData>

Recieved request: 
java.lang.NullPointerException
at protocol.MessageParser.compileResponse(MessageParser.java:23)
at client.Client.sendResponseToServer(Client.java:67)
at client.Client.beginRequestListener(Client.java:52)
at client.ClientInterface.main(ClientInterface.java:107)

留言类:

公共类消息{

public Message(String data){



}

public Message(String action, String actionData){

    this.action = action;
    this.actionData = actionData;

}

 public void send(PrintWriter connection){

    try{
        connection.println(this.toString());
        connection.flush();
        //System.out.println(this.toString());
    }catch(Exception ex){
        System.out.println("Could not send Message.");
    }


}

@java.lang.Override
public String toString(){

    return  
           action_marker + action + action_marker +
           actionData_marker + actionData + actionData_marker +
           eof_marker;

}

public static Message parseDataToMessage(String data){


    Message ms = null;
    if(data.isEmpty() == false){
    int begin_action_marker = data.indexOf("<action>")+8;
    int end_action_marker = data.lastIndexOf("<action>");

    String action = data.substring(begin_action_marker, end_action_marker);

    int begin_actionData_marker = data.indexOf("<actionData>")+12;
    int end_actionData_marker = data.lastIndexOf("<actionData>");

    String actionData = data.substring(begin_actionData_marker, end_actionData_marker);

    ms = new Message(action, actionData);



    }

    return ms;

}

public void setAction(String action){
    this.action = action;

}

public String getActionData(){
    return actionData;

}

public String getAction(){
    return action;

}

public void setActionData(String action){
    this.actionData = action;

}

public String eof_marker = "\r\n";

public String action;
public String action_marker = "<action>";

public String actionData;   
public String actionData_marker = "<actionData>";

}

4

2 回答 2

1

我猜:

  • 您收到一个空请求(request = requestInStream.readLine())
  • this 转到Message.parseDataToMessage(request);which 返回null空请求
  • 在中生成 NullPointerExceptioncompileResponse

(可能的)解决方案:改变这个

while((request = requestInStream.readLine())!=""){

进入这个:

while(!(request = requestInStream.readLine()).isEmpty())

为什么您的代码不起作用:如何比较 Java 中的字符串?

于 2013-06-04T21:52:11.207 回答
0

while((request = requestInStream.readLine())!=""){

这个测试是为了什么?你期待空请求吗?你不应该。如果你得到一个,那就是发件人的错误。

readLine()但是,在对它进行任何其他操作之前,您必须测试 for null 的结果。该行应为:

while((request = requestInStream.readLine())!= null){
于 2013-06-05T02:03:14.933 回答