Java:关闭客户端套接字会重置服务器套接字 [英] java: closing client socket resets server socket

查看:99
本文介绍了Java:关闭客户端套接字会重置服务器套接字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个非常简单的大写Java程序.客户端将从标准输入中读取的文本发送到服务器,该服务器将该文本转换为大写字母.程序运行良好,但是一旦客户端停止(使用了NetBeans ide),服务器也将重置.服务器套接字应该继续侦听来自客户端的新连接,而不管客户端正在停止.

I have a very simple capitalization Java program. Client sends text read from standard input to server which converts that text into capital letters. Program works well but once client is stopped (NetBeans ide used), server is also reset. Server socket should keep listening for new connection from clients regardless of a client being stopped.

public class Client
{
public static void main(String[] args) throws IOException
{
    try(Socket s=new Socket("localhost",9090))
    {
        while(true)
        {
            PrintWriter out=new PrintWriter(s.getOutputStream(),true);
            BufferedReader rd=new BufferedReader(new InputStreamReader(s.getInputStream()));
            BufferedReader from=new BufferedReader(new InputStreamReader(System.in));

            String read=from.readLine();

            out.println(read);

            String answer;
            answer=rd.readLine();

            System.out.println(answer);
        }
    }
}
}

public class Server
{
public static void main(String[] args) throws IOException
{
    try(ServerSocket listener = new ServerSocket(9090);
            Socket socket = listener.accept();)
            {

                while (true)
                {
                    BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                    System.out.println("Started...");

                    String transform=br.readLine();

                    String newStr=transform.toUpperCase();

                    out.println(newStr);
                }
            }
}
}

推荐答案

发生的是正常行为.您的服务器代码仅包含单个客户端的处理. listener.accept()函数仅接受与服务器的最新连接.您需要将listened.accept()放入循环中,并处理其中引发的所有异常.服务器端代码应如下所示:

What happens is a normal behaviour. You server code only includes handling of a single client. The listener.accept() function only accepts latest connection to server. You need to put the listened.accept() in loop and handle all the exceptions that are raised within. The server-side code should look like this:

public class Server
{
    public static void main(String[] args) throws IOException
    {
        try(ServerSocket listener = new ServerSocket(9090);
        while (true) {
            try {
                        Socket socket = listener.accept();)
                        …
            } catch (SocketException ex) {
                ...
            }
        }
    }
}

但是请记住,这段代码一次只能处理一个客户端.此代码中没有多线程.

But keep in mind that this code will only handle single client at a time. No multi-threading in this code.

这篇关于Java:关闭客户端套接字会重置服务器套接字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆