服务器套接字断开连接并停止侦听

时间:2013-08-23 12:43:10

标签: java multithreading sockets loops client

这是我从未想过的问题。我问了很多人,他们甚至都不知道。无论如何,让我们来解决问题。这是我试图做的......创建一个客户端和一个服务器。客户端连接到服务器,并每隔3分钟向其发送一条消息(我减少了测试时间)。但是必须有两个独立的线程(一个用于客户端和服务器)。我发现的是,客户端将继续发送消息,但服务器将不再侦听端口1234。

客户端:

import java.io.PrintWriter;
import java.net.Socket;


public class Client {

        public Client(){
                startClient();
        }

        public void startClient(){
                new Thread(new Runnable(){
                        @Override
                        public synchronized void run(){
                                try{
                                        Socket sendChat = new Socket("localhost", 1234);
                                        PrintWriter writer = new      PrintWriter(sendChat.getOutputStream());

                                while(true){
                                        Thread.sleep(1000); // normally 180000

                                        writer.println("Hello Server!");
                                }
                                }catch(Exception err){
                                        err.printStackTrace();
                                }
                        }
                }).start();
        }

}

服务器:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;


public class Server {

public Server(){
        startServer();
}

    public void startServer(){
            new Thread(new Runnable(){
                    @Override
                    public synchronized void run(){
                            try{
                                    @SuppressWarnings("resource")
                                    ServerSocket server = new ServerSocket(1234);

                                    while(true){
                                            final Socket test = server.accept();
                                            BufferedReader reader = new BufferedReader(new InputStreamReader(test.getInputStream()));

                                            while(!test.isClosed()) {
                                                    Date date = new Date();

                                                    System.out.println("Server got message from client " + date);
                                            }
                                            reader.close();
                                    }
                            }catch(Exception err){
                                    err.printStackTrace();
                            }
                    }
            }).start();
    }

}

开始:

public class Start {
    public static void main(String[] args){
        new Server();
        new Client();   
    }
}

如果有人能告诉我出了什么问题,我会非常感激,因为老实说我没有任何线索。

3 个答案:

答案 0 :(得分:0)

在Server类的while循环中写下两行,它将适合您。

 final Socket test = server.accept();
 BufferedReader reader = new BufferedReader(new InputStreamReader(test.getInputStream()));

您的代码中发生了什么:服务器将在每次完成while循环后等待新客户端,但是没有客户端将在该实例上与服务器连接。因此,服务器将等待,直到新客户端到来,服务器将接受该新客户端并继续其处理。

答案 1 :(得分:0)

您是循环堆栈,请在消息后尝试关闭客户端中的连接。

答案 2 :(得分:0)

查看他们使用的这些链接

socket.setKeepAlive(true);

java.net.Socket TCP keep-alive usage

Permanent and persistent Socket connection in java