Java套接字输入流输出流

时间:2017-04-12 12:01:48

标签: java sockets

我有服务器:

StringBuilder sb = new StringBuilder();

    try {

        ServerSocket ses = new ServerSocket(7841);
        Socket s=ses.accept();

        Reader br = new InputStreamReader(s.getInputStream());
        OutputStream os = s.getOutputStream();
        os.write("string from system".getBytes());
        os.flush();

        char[] request = new char[6];
        int count = br.read(request);
        while (count!=-1) {
            sb.append(new String(request, 0, count));
            count = br.read(request);
            System.out.println(count);
            System.out.println(sb);
        }
        System.out.println("111"+count);
        System.out.println(sb);

    }
    catch (IOException e) {e.printStackTrace();}
    System.out.println(sb);

和客户:

StringBuilder sb = new StringBuilder();

    try {

        Socket s = new Socket("127.0.0.1",7839);
        Reader br = new InputStreamReader(s.getInputStream());
        OutputStream os = s.getOutputStream();
        os.write("string from project".getBytes());
        os.flush();


        char[] request = new char[6];
        int count = br.read(request);
        while (count!=-1) {
            sb.append(new String(request, 0 , count));
            // if (sb.toString().endsWith("</family>")) {
            //     break;
            // }
            count = br.read(request);
            System.out.println(count);
            System.out.println(sb);
        }
        System.out.println("111"+count);
        System.out.println(sb);

    }
    catch (IOException e) {e.printStackTrace();}
    System.out.println(sb);

问题是我无法读到字符串直到最后。例如,服务器只读“projec中的字符串”。

此外,客户端和服务器中都未找到代码System.out.println("111"+count);。该计划有什么问题?非常感谢您的任何想法。

1 个答案:

答案 0 :(得分:0)

你的程序很好,唯一的问题是你的Server监听端口 7841 ,但你的客户端尝试连接端口 7839 ,他们必须连接到同一个端口。

我认为你需要找出协议之类的东西:

  1. 服务器开始侦听,还没有客户端,服务器正在等待方法accept();
  2. 当您的客户端连接时,您必须决定:谁将首先说话,谁将回复,对话开始的标志以及对话结束的标志,此后客户端和服务器都可以正确关闭此连接。请参阅此链接https://github.com/numpy/numpy/issues/8933

  3. 如果你不喜欢请求 - 响应模式,你可以同时读写,那么也许线程方法更好,使用两个线程分开读写过程,所以读取过程不会阻塞写过程。

  4. 回到你的问题,读取过程在while循环中阻止程序,因此无法到达行System.out.print(...)