【问题标题】:Java Socket why server can not reply clientJava Socket为什么服务器不能回复客户端
【发布时间】:2013-10-29 15:19:00
【问题描述】:

我想编写代码让客户端向服务器发送一个字符串,服务器打印字符串并回复一个字符串,然后客户端打印字符串服务器回复。
我的服务器

public class Server {

public static void main(String[] args) throws IOException {
    ServerSocket ss = null;
    Socket s = null;
    try {
        ss = new ServerSocket(34000);
        s = ss.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                s.getInputStream()));
        OutputStreamWriter out = new OutputStreamWriter(s.getOutputStream());

        while (true) {
            String string = in.readLine();
            if (string != null) {
                System.out.println("br: " + string);

                if (string.equals("end")) {
                    out.write("to end");
                    out.flush();
                    out.close();
                    System.out.println("end");
                    // break;
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        s.close();
        ss.close();
    }
}
}

我的客户:

public class Client {
public static void main(String[] args) {
    Socket socket =null;


    try {
        socket = new Socket("localhost", 34000);
        BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream()));
        OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());

        String string = "";
        string = "end";
        out.write(string);
        out.flush();
        while(true){
            String string2 = in.readLine();
            if(string2.equals("to end")){
                System.out.println("yes sir");
                break;
            }
        }


    }  catch (Exception e) {
        e.printStackTrace();
    }finally{
        try {
            System.out.println("closed client");
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
}

有什么问题吗?如果我删除客户端类中的代码“while(true) ...”,就可以了。

【问题讨论】:

  • 你能解释一下发生了什么
  • 您发送新行吗?
  • "public String readLine() 读取一行文本。一行被认为是由换行符('\n')、回车符('\r')中的任何一个终止,或回车后紧跟换行符。” -> docs.oracle.com/javase/7/docs/api/java/io/…
  • 当你的服务器读取换行符in.readLine()时,你可以在客户端使用如下:PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.println(string);
  • 您的代码错误。如果readLine() 返回null,则必须关闭套接字并退出循环。

标签: java sockets


【解决方案1】:

我没有看到服务器响应。 你做一个

System.out.println("br: " + string);

但不是一个

out.write(string);
out.flush();

【讨论】:

    【解决方案2】:

    你应该在写入流的字符串末尾添加"\r\n"

    示例:

    客户:

        string = "end";
        out.write(string + "\r\n");
        out.flush();
    

    服务器:

        out.write("to end" + "\r\n");
        out.flush();
        out.close();
        System.out.println("end");
                    // break;
    

    【讨论】:

    【解决方案3】:

    将“\n”附加到服务器响应的末尾。

    outToClient.writeBytes(sb.toString() + "\n"); 
    

    【讨论】:

      【解决方案4】:

      你在读行,但不是在写行。添加换行符,或致电BufferedReader.newLine().

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        相关资源
        最近更新 更多