簡體   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