套接字发送和检索

时间:2013-05-22 06:45:42

标签: java multithreading sockets

美好的一天所有我都是java的新手,我想知道是否有人可以帮我解决这个问题 我有一个服务器,它从客户端接收信息但我的if语句检查传递的值不起作用。

这是我的服务器代码。

   Session(Socket s){
        soc = s;
        try{
            br = new BufferedReader(new InputStreamReader(soc.getInputStream()));

            pw = new PrintWriter(new BufferedOutputStream(soc.getOutputStream()),true);
            pw.println("Welcome");           
        }catch(IOException ioe){
            System.out.println(ioe);
        }


        if(runner == null){
            runner = new Thread(this);
            runner.start();
        }
    }

    public void run(){
        while(runner == Thread.currentThread()){
            try{
                String input = br.readLine().toString();
                    if(input != null){
                        String output = Protocol.ProcessInput(input);
                        pw.println(output);
                        System.out.println(input);


                        if(output.equals("Good Bye")){
                            runner = null;
                            pw.close();
                            br.close();
                            soc.close();
                        }
                 **This if statement doesn't work   ↓**
                        if(Protocol.ProcessInput(input).equalsIgnoreCase("tiaan")){
                           // System.exit(0);
                            System.out.println("Got tiaan!!!");
                        }
                    }

            }catch(IOException ie){
                System.out.println(ie);
            }
            try{
                Thread.sleep(10);
            }catch(InterruptedException ie){
                System.out.println(ie);
            }
        }
    }


}

class Protocol{
     static String ProcessInput(String input){
        if(input.equalsIgnoreCase("Hello")){
            return "Well hello to you to";
        }else{
            return "Good bye";
        }
    }
}

1 个答案:

答案 0 :(得分:2)

确定。让我们来看看if语句:

if(Protocol.ProcessInput(input).equalsIgnoreCase("tiaan")){
    // System.exit(0);
    System.out.println("Got tiaan!!!");
}

该代码等同于以下内容:

String output = Protocol.ProcessInput(input)
if(output.equalsIgnoreCase("tiaan")){
    // System.exit(0);
    System.out.println("Got tiaan!!!");
}

因此ProcessInput的输出与字符串“tiaan”进行比较,查看ProcessInput表明它永远不会返回该字符串。所以也许你真的想做别的事情,例如直接将输入与“tiaan”比较或改变ProcessInput的实现:

if(input.equalsIgnoreCase("tiaan")){
    // System.exit(0);
    System.out.println("Got tiaan!!!");
}

请注意,在读取输入时可能会出现NullPointerException:

//Change this:
String input = br.readLine().toString();
//Into this:
String input = br.readLine();

readLine已经为您提供了一个字符串,因此您最后不需要使用toString。如果readLine给出null,当它到达流的末尾时它会执行,那么toString的调用将导致NullPointerException。在下一行,您实际检查输入是否为空,这是好的,但使用您的代码,错误将在检查之前发生。