繁体   English   中英

Java BufferedReader接收空字符串

[英]Java BufferedReader receives null string

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

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

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;

}

MessageParser类:

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>";

}

我猜:

  • 您在(request = requestInStream.readLine())收到一个空请求
  • 这转到Message.parseDataToMessage(request); 对于空请求返回null
  • compileResponse中生成NullPointerException

(可能)解决方案:更改此

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

到这个:

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

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

while((request = requestInStream.readLine())!=“”){

这个测试是做什么用的? 您是否期待空的请求? 你不应该这样 如果您发现其中一个,则说明发送方存在错误。

但是,在执行其他操作之前,必须测试readLine()的结果是否为null。 该行应显示为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM