当前位置: 首页 > 知识库问答 >
问题:

Java客户端服务器“套接字已关闭”

尤博达
2023-03-14

我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。

服务器文件

public class Server {

    public static ServerSocket s = null;

    public static void main(String[] args) {
        //Create the server socket
        int port = 1111;
        if (args.length > 0) {
            if (isInt(args[0]) && Integer.parseInt(args[0]) < 65537) {
                port = Integer.parseInt(args[0]);
            }
        }
        try {
            s = new ServerSocket(port);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            s.setSoTimeout(0);
        } catch (SocketException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Runnable r = new Runnable() {
            public void run() {
                while (true) {
                    Socket caught = null;
                    try {
                        caught = Server.s.accept();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    if (caught == null) {
                        return;
                    }

                    InputStream is = null;
                    try {
                        is = caught.getInputStream();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    try {
                        String output;
                        while ((output = br.readLine()) != null) {
                            handleCommand(output, caught);
                        }
                    } catch (Exception e) {
                    }
                    try {
                        br.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };

        Thread t = new Thread(r);
        t.start();
    }

    public static boolean isInt(String in) {
        try {
            Integer.parseInt(in);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static void handleCommand(String in, Socket s1) {
        if (in.equalsIgnoreCase("test")) {
            System.out.println("Recieved Test Command..");
            System.out.println("Sending response..");
            PrintStream ps = null;
            try {
                ps = new PrintStream(s1.getOutputStream(), true);
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps.close();
        }
    }
}

客户端文件

public class Client {

    public static Socket s = null;

    public static void main(String[] args) {
        int port = 1111;
        String server = "localhost";
        if (args.length > 0) {
            if (isInt(args[0]) && Integer.parseInt(args[0]) < 65537) {
                port = Integer.parseInt(args[0]);
            }
        }
        if (args.length > 1) {
            server = args[1];
        }


        try {
            s = new Socket(server, port);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (s != null) {

            Runnable r = new Runnable() {
                public void run() {
                    while (true) {
                        InputStream is = null;
                        try {
                            is = s.getInputStream();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));
                        try {
                            String output;
                            while ((output = br.readLine()) != null) {
                                System.out.println(output);
                            }
                        } catch (Exception e) {
                        }
                        try {
                            br.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            };

            Thread t = new Thread(r);
            t.start();

            PrintStream ps = null;
            try {
                ps = new PrintStream(s.getOutputStream(), true);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Sending Test message..");
            try {

                ps.println("test");

            } catch (Exception e) {
                System.out.println("Error: - " + e.getMessage());
            }


        }
    }

    public static boolean isInt(String in) {
        try {
            Integer.parseInt(in);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。

提前感谢您的帮助。我只是想在这里学习。

共有1个答案

慕容嘉荣
2023-03-14

在第61行的服务器中,当您进行第一次读取时,您的客户端没有机会发送数据,因此它不会在循环中停止并向前移动以关闭第68行的读取器。

尝试创建一个类来处理服务器上的传入连接,这使得更容易考虑在服务器上做什么,像ClientHandler这样的东西将是一个不错的选择;)

玩得高兴

 类似资料:
  • 问题内容: 我必须使用Java的套接字API编写多线程客户端和服务器。客户端和服务器都是多线程的,因此服务器可以处理多个连接,客户端可以测试服务器处理连接的能力。 我的代码在这里:https : //github.com/sandyw/Simple-Java-Client- Server 我有几个可能是相关的问题。一,偶尔会有一个客户端线程抛出 从其位置来看,这意味着服务器在客户端完成从套接字读取

  • 问题内容: 我正在通过TCP创建一个Java客户端/服务器应用程序,其中有两个套接字: 一种是交换消息。 二是用于文件传输。 我已经在服务器中创建了两个ServerSockets,以便 通过接受ServerSockets 创建套接字1和2 。 首先,客户端通过第一个套接字发送一些字节, 以便它可以告诉服务器它需要哪个文件。 然后,服务器通过第二个套接字将文件发送给客户端。 客户端收到文件后,尝试将

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我

  • 我组装了一个Java套接字服务器和客户端,可以互相发送消息,我想使用JavaScript作为客户端,但是。。。下面是在托管Java服务器并加载JavaScript客户端时发生的情况。 JavaScript: 这将在chrome控制台中打印: 到“ws://127.0.0.1:9005/”的WebSocket连接失败:WebSocket握手期间出错:无效状态行 WebSocket错误[对象事件] 我

  • 我正在尝试连接一个带有gui的客户端和一个没有gui的服务器。连接正在进行中,但我看不到这两个应用程序之间的任何消息。(我应该将服务器放在客户端中,而将客户端放在服务器中) 客户端连接代码: PS:我也在服务器中尝试了PrintWriter,也尝试了try catch in stream语句,问题仍然存在。