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

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()); 试试 服务器端同理

    评论

报告相同问题?

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)