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

java tcp套接字检查客户端已断开连接

狄法
2023-03-14

我想检查一下我的客户是否断开了连接。根据我的研究,一种可能的方式是我可以继续给客户写信。如果客户端未能接收到消息,则表示已断开连接。我向相应的客户端发送消息“Checking Connection:Client”clientNo。

我将clientNo 1连接到服务器,它接收

客户1

"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs
"Checking Connection: Client1" <-- output every 10secs

但是当我将另一个客户端连接到服务器时,我的clientNo1停止接收来自服务器的消息,我的clientNo2现在将接收到来自服务器的消息

客户2

"Checking Connection: Client2"  <-- output every 10secs    
"Checking Connection: Client1"  <-- output every 10secs
"Checking Connection: Client2"  <-- output every 10secs    
"Checking Connection: Client1"  <-- output every 10secs

期望输出

客户1

"Checking Connection: Client1" <-- output every 10secs 
"Checking Connection: Client1" <-- output every 10secs 
"Checking Connection: Client1" <-- output every 10secs 

客户2

"Checking Connection: Client2" <-- output every 10secs 
"Checking Connection: Client2" <-- output every 10secs 
"Checking Connection: Client2" <-- output every 10secs 

请帮忙。非常感谢。

Server.java

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    private int portNo = 0;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    private boolean clientAlive = true;

    @SuppressWarnings("resource")
    public Server(int portNo) {
        Socket socket = null;
        this.portNo = portNo;
        ServerSocket sSocket = null;
        int clientNo = 1;
        try {
            sSocket = new ServerSocket(this.portNo);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        while(true) {
            try {
                socket = sSocket.accept();
            } catch (IOException e) {
                e.printStackTrace();
            }
             new Thread(new acceptClient(socket,clientNo)).start();
             clientNo += 1;
        }
    }

    class acceptClient implements Runnable {
        Socket socket;
        int clientNo = 1;
        String writeToClient = "";

        public acceptClient(Socket socket, int clientNo) {
            this.socket = socket;
            this.clientNo = clientNo;
        }

        public void run() {
            try {
                out = new ObjectOutputStream(socket.getOutputStream());
                in = new ObjectInputStream(socket.getInputStream());
            } catch(IOException exception) {
                System.out.println("Error: " + exception);
            }

            while(clientAlive) {
                writeToClient = "Checking Connection: Client" + clientNo;
                sendData(out, writeToClient.getBytes());

                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if(!clientAlive) {
                    break;
                }

            }
        }
    }

    public synchronized void sendData(ObjectOutputStream os, byte[] byteData) {
        if (byteData == null) {
            return;
        }
        try {
            os.write(byteData);
            os.flush();
        }
        catch (Exception e) {
            System.out.println("Client Disconnected");
            clientAlive = false;
        }
    }

    public static void main(String[] args) {
        System.out.println("Server started");
        new Server(5550);
    }
}

客户Java语言

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JDialog;
import javax.swing.JOptionPane;


public class Client {
    public static void main(String args[]) {
        clientConnection();
    }

    public static void clientConnection() {
        Socket clientSocket = null;
        ObjectOutputStream out = null;
        ObjectInputStream in = null;

        try {
            clientSocket = new Socket("localhost", 5550);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 

        try {
            out = new ObjectOutputStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }   

        try {
            in = new ObjectInputStream(clientSocket.getInputStream());

        } catch (IOException e) {
            e.printStackTrace();
        }  

        byte[] byteData = null;
        while(true) {
            try {
                byteData = receive(in);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(new String(byteData));
        }
    }

    public static byte[] receive(ObjectInputStream is) throws Exception {
        try {
            byte[] inputData = new byte[1024];
            is.read(inputData);
            return inputData;
        }
        catch (Exception exception) {
            throw exception;
        }
    }
}

共有1个答案

颛孙喜
2023-03-14

您的ObjectInputStream和ObjectOutputStream是服务器类的一部分。让他们成为acceptClient类的成员,这样就可以了。

 类似资料:
  • 我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法: 如何确定tcp是否连接? 我的代码如下: 多谢帮忙。

  • 我正在编写一个使用tcp套接字的服务器/客户端应用程序,我的问题是如何检测半开放连接,我计划使用keep-alive但有些人建议我做我自己的协议,所以我现在的计划是: 在服务器端: 服务器会等待10秒等待客户端发送数据,如果在给定的时间内服务器没有收到客户端的消息,服务器会将客户端标记为断开连接,否则,如果服务器收到客户端的消息,则会重新设置计时器。 我现在的问题是,这样行吗?还是我做错了?还是一

  • 我正在开发一个与许多客户端连接的服务器。我需要知道客户端何时与服务器断开连接。因此,每个客户端都向服务器发送一个特定的字符。如果两秒钟后没有收到字符,那么我应该断开服务器与客户端的连接(释放为此客户端分配的资源)。 这是我的服务器的主要代码: 第一个问题是,我用来识别在线客户端的方式(每秒发送特定消息)是否是一种好方法? 如果它是好的,我如何使用检测与女巫客户端相关,然后如何断开密钥与服务器的连接

  • 当我再次调用时,第二次调用将按预期返回。但我想明白,为什么第一次打电话成功了?我是否遗漏了某些特定于TCP的细节?这种奇怪的(对我来说)行为只针对{活动,错误}连接。

  • 我在unix(OSX)机器上使用kqueue建立了一个TCP/IP echo服务器,它可以打开100个TCP/IP端口,每个端口接受4000个客户端,我使用另外15台机器建立了大约23万个连接。(每道工序4000康纳,每箱4道工序) 服务器似乎可以接受更多,但问题是客户端,建立更多连接是有限制的。如Windows XP-3000、Windows7、UNIX-16384。 我怎么克服?

  • 我正在用Java编写一个简单的TCP客户机/服务器程序对,如果客户机在10秒内还没有发送任何东西,服务器必须断开连接。socket.setsoTimeout()使我得到了这一点,服务器就可以很好地断开连接。问题是--我如何让客户端确定服务器是否关闭?目前,我使用DataOutputStream向服务器写入数据,这里的一些答案表明,向封闭套接字写入数据将引发IOException,但这不会发生。 编