java:关闭客户端套接字重置服务器套接字

时间:2015-02-07 20:49:58

标签: java client server

我有一个非常简单的大写Java程序。客户端将从标准输入读取的文本发送到服务器,后者将该文本转换为大写字母程序运行良好,但一旦客户端停止(使用NetBeans ide),服务器也会重置。无论客户端是否被停止,服务器套接字都应该继续监听来自客户端的新连接。

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);
                }
            }
}
}

2 个答案:

答案 0 :(得分:0)

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

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) {
                ...
            }
        }
    }
}

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

答案 1 :(得分:-1)

您的Server正在关闭连接然后完成,因为它是在while循环之外创建的。我相信这就是你所需要的。

public class Server {
    public static void main (final String[] args)
            throws IOException {

        while (true) {

            try (ServerSocket listener = new ServerSocket(9090); Socket socket = listener.accept();) {

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

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

                    final String transform = br.readLine();
                    if (transform == null) 
                        break;

                    final String newStr = transform.toUpperCase();

                    out.println(newStr);
                }
            }
        }
    }
}