ljq869115191
钢镚—
采纳率20%
2017-10-24 14:28

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

30
    //客户端
 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条回答

  • zym1095839105 忽言乱语 1月前

    楼主解决了么

    点赞 评论 复制链接分享
  • qq_34550154 qq_34550154 4年前

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

    点赞 8 评论 复制链接分享
  • ljq869115191 钢镚— 4年前

    我再顶顶! c币 不够我再加!

    点赞 评论 复制链接分享
  • qq_34550154 qq_34550154 4年前

    同样的问题等大神解决

    点赞 评论 复制链接分享
  • xzsrbr163 霸气男__ 4年前

    没有具体看代码,感觉问题大概是流没有正确关闭吧。具体问题等大神解决吧,来观摩一下

    点赞 评论 复制链接分享