XazGreatXia 2024-06-06 14:09 采纳率: 29%
浏览 1
已结题

Java Socket编程小问题

客户端:


import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.util.Scanner;
public class sockclient {
    public static void main(String[] args)  {
        try {

        String host = "127.0.0.1";

        int port = 8888;

        Socket socket = new Socket(host,port);

        OutputStream outputstream = socket.getOutputStream();

        System.out.println("(Enter your Message): ");

        String m = null;

        String t;

        Scanner s = new Scanner(System.in);

        if(s.hasNext()) {

            m = s.nextLine();

        }

        s.close();

        t = "(Send)" + m;

        System.out.println(t);

        byte[] SendByte = m.getBytes("GBK");

        OutputStream output = socket.getOutputStream();

        output.write(SendByte);

        byte[] GetByte = new byte[2048];

        InputStream input = socket.getInputStream();

        int read = input.read(GetByte);

        System.out.println("(Server) " + new String(GetByte,0,read,Charset.defaultCharset()));

        output.close();

        socket.close();
        
    } catch(Exception e) {

        e.printStackTrace();

    }
        
    }
}

服务端:

import java.io.InputStream;
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
import java.util.*;


public class sockserver {
    public static void main(String args[]) throws Exception {
        int port = 8888;

        ServerSocket server  = new ServerSocket(port);

        System.out.println("(Listening)Port " + port);

        ExecutorService TPool = Executors.newFixedThreadPool(100);

        while(true) {

            Socket s = server.accept();

            Runnable runnable=()-> {
                try {

                    byte[] Bytes = new byte[2048];

                    InputStream input = s.getInputStream();

                    int Length;

                    StringBuilder sb = new StringBuilder();

                    while((Length = input.read(Bytes)) != -1) {

                        sb.append(new String(Bytes,0,Length,"GBK"));

                    } 

                    System.out.println("(Recv) " + sb);

                    OutputStream out = s.getOutputStream();

                    String n = "Receive your Message";

                    byte[] Send = n.getBytes();

                    out.write(Send);

                    input.close();

                    s.close();

                } catch (Exception e) {

                    e.printStackTrace();

                }
            };

            TPool.submit(runnable);


        }
    }
}




请问各位博主,以上代码存在哪些问题导致只有客户端退出,服务的才会收到消息

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 14:09
    关注

    引自免费微信小程序:皆我百晓生

    在提供的Java代码中,存在一个主要的问题,这可能导致只有当客户端关闭时,服务器才能接收到消息。问题出在客户端发送消息后没有关闭输出流。当客户端关闭套接字时,服务器端会检测到连接断开,并开始读取数据,但此时客户端已经不再发送任何数据。

    为了解决这个问题,你需要在客户端发送完消息后立即关闭输出流(output.close())。以下是修改后的客户端代码:

    import java.io.*;
    import java.net.*;
    import java.nio.charset.Charset;
    import java.util.Scanner;
    
    public class sockclient {
        public static void main(String[] args) {
            try {
                // ... (其他部分保持不变)
    
                byte[] SendByte = m.getBytes("GBK");
                OutputStream output = socket.getOutputStream();
                output.write(SendByte);
                
                // 添加这一行,确保发送完消息后关闭输出流
                output.flush();
                output.close();
    
                // ... (其他部分保持不变)
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    添加 output.flush();output.close(); 之后,客户端将正确地关闭其与服务器之间的通信通道。这样,服务器在等待接收消息时不会无限期地阻塞,而会在客户端关闭连接时正确地读取并处理消息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月23日
  • 已采纳回答 7月15日
  • 创建了问题 6月6日

悬赏问题

  • ¥20 双硬盘安装Ubuntu后windows 无法挂载硬盘
  • ¥15 下面求极限的步骤哪里不对,正确答案是a1a2…an
  • ¥15 帮我利用jupyter 运行一个正确的代码
  • ¥15 如何使用Gephi软件和Python包中的GephiStreamer交互
  • ¥15 sqlite加密问题咨询
  • ¥15 appdesigner接收不到udp组播的数据
  • ¥15 verilog 非阻塞赋值下的移位拼接错误
  • ¥100 两个按钮控制一个LED
  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理