「已注销」 2017-10-24 14:28 采纳率: 33.3%
浏览 5498
已结题

java Socket 在客户端断开之后才可以接收到客户端发送的消息!

    //客户端
 public class Test {
    private static boolean is = true;

    public static void main(String[] args) throws IOException,
            InterruptedException {

        Socket socket = new Socket("127.0.0.1", 6677);
        System.out.println("链接成功");
        Scanner scanner = new Scanner(System.in);
        while (is) {
            System.out.println("请输入!!!");
            int n = scanner.nextInt();
            switch (n) {
            case 1:
                OutputStream os = socket.getOutputStream();
                os.write("hello world".getBytes());
                os.flush();
                // os.close();
                // socket.close();
                // IoUtil.IoClose(os);
                System.out.println("发送成功");
                break;
            case 2:
                System.out.println("循环关闭");
                is = false;
                break;
            default:
                is = false;
                System.out.println("输入错误---循环关闭");
                break;
            }
        }
    }
}
 //服务器端  太多了 就贴一部分
 @Override
    public void run() {
        MessageThread messageThread = null;
        InputStream iss = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        while (is) {
            try {
                // 监听
                Socket socket = serverSocket.accept();
                System.out.println("链接成功");
                iss = socket.getInputStream();
                isr = new InputStreamReader(iss);
                br = new BufferedReader(isr);
                String len;
                StringBuffer sb = new StringBuffer();
                while ((len = br.readLine()) != null) {
                    sb.append(len);
                }
                System.out.println(sb.toString());
                // iss.close();
                // IoUtil.IoClose(br, isr, iss);
                SocketMap.put(sb.toString(), socket);
                /**
                 * 开启接受消息的线程
                 */
                messageThread = new MessageThread(socket);
                messageThread.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                messageThread.setFlag(false);
            }
        }

大致代码就这些 问题出在 socket 可以链接成功 但是 客户端发送的消息要等 客户端断开链接之后才能接收到 或者 关闭客户端的输出流也可以!
C#为客户端的时候也一样!

  • 写回答

5条回答

  • qq_34550154 2017-10-28 01:47
    关注

    readline()函数其实自带了一个阻塞,readline()读取的结束标识符是"\n",把客户端的os.write("hello world".getBytes()); 改成 os.write("hello world\n".getBytes()); 试试 服务器端同理

    评论

报告相同问题?

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多