Java BufferedReader接收空字符串

时间:2013-06-04 21:34:37

标签: java sockets bufferedreader printwriter

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

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

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

请求发送代码:

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

}

2 个答案:

答案 0 :(得分:1)

我的猜测:

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

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

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

进入这个:

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

为什么您的代码不起作用:How do I compare strings in Java?

答案 1 :(得分:0)

  

while((request = requestInStream.readLine())!=&#34;&#34;){

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

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

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