【问题标题】:java: closing client socket resets server socketjava:关闭客户端套接字重置服务器套接字
【发布时间】:2015-04-07 20:39:39
【问题描述】:

我有一个非常简单的大写 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);
                }
            }
}
}

【问题讨论】:

标签: java client server


【解决方案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);
                }
            }
        }
    }
}

【讨论】:

  • 不,因为这个程序只会从每个客户端读取一行。
  • 抱歉,我没注意。更新了答案。
  • 不,因为这个程序在循环内创建了ServerSocket,并泄漏了套接字。
  • Ìsn's not the socket closes and free after the exception of the client disconnect unwraps back to the try block,有效地完成ServerSocket
【解决方案2】:

所发生的是正常行为。您的服务器代码仅包括对单个客户端的处理。 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) {
                ...
            }
        }
    }
}

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

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2013-01-16
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多