java - ServerSocket Java 的套接字验证

标签 java sockets

我正在尝试创建“多客户端-单服务器”连接。 我的客户端打开连接并在服务器端创建

     Client clt = new Client("127.0.0.1", 9000);
        clt.openConn();

...

public Client(String serverAddress, int serverPort) {
    this.serverAddress = serverAddress;
    this.serverPort = serverPort;
}
try {
        this.clientSocket = new Socket(this.serverAddress, this.serverPort);
        this.clientSocket.setKeepAlive(true);
        this.clientSocket.setSoTimeout(0);

            oos = new DataOutputStream(this.clientSocket.getOutputStream());
            ois = new DataInputStream(this.clientSocket.getInputStream());...}

...

在服务器端,我创建了 ServerSocket 的 ListArray,并将它们包装在线程上。

    ServerSocket serverSocket = null ;
        Socket clientSocket;
        boolean listening = true;
        ArrayList threadList = new ArrayList();
        Iterator itSrvThr;
    try {
            serverSocket = new ServerSocket(port);

        } catch (IOException e) {
            System.err.println("Could not listen on port: " + port + ".");
            System.exit(-1);
        }
        while (listening) {
            clientSocket = serverSocket.accept();
            ServerThread srvThread = new ServerThread(clientSocket);
            srvThread.start();
`...`
    }

哪里

 ServerThread extends Thread
    {...
         public void run() {
           this.ois = new DataInputStream(socket.getInputStream());
           this.oos = new DataOutputStream(socket.getOutputStream());    
         }
    }

我的程序发送和接收对象(我称它们为“Datagramm”),它们是文件和字符串的某种包装器(让我们说它是客户端服务器的某种语言)

现在谈谈我遇到的问题。每次需要从服务器端测试“Activity ”套接字时,我都必须进行验证...... 我试图在 ArrayList 中出现新元素时进行此验证,但这给我带来了“Datagramm”发送的问题

itSrvThr = threadList.iterator();
            while (itSrvThr.hasNext()) {
                ServerThread st = (ServerThread) itSrvThr.next();
                boolean stoppedSocket = st.getStopped();

                if (stoppedSocket) {
                    st.stop();
                    itSrvThr.remove();
                }else {??? resolution???}

stoppedSocket - 它是一个值,表示从客户端站点以程序方式关闭套接字。

老实说,我只使用套接字和线程几个星期,这就是为什么每一个帮助和批评都是可以接受的。 ... 感谢您的回答,但我在心跳编码方面遇到问题。首先,心跳的位置必须放置在服务器端。

最佳答案

我建议您在一段时间内(几秒)没有发送消息时从客户端和/或服务器发送一条心跳消息。当您在这段时间内没有收到任何消息时,另一端可能会超时.

如果您有像 {message length} {message} 这样的协议(protocol),我使用 message-length=0 作为心跳。

关于java - ServerSocket Java 的套接字验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11359318/

相关文章:

java - 通过套接字连接到远程系统

java - Eclipse JDT ASTParser 错误地转换枚举声明节点

java - 如何在数组列表中显示之前过滤 SQLite 数据库的结果?

android - java.io.IOException : Service discovery failed

c# - 无法使用 C# 读取系统日志

Python 3 - 带有 select.select() 的套接字 - 检测连接丢失

c# - 使用套接字传输二进制数据?

java - 循环 i++ 与 i+=2

java - 字符串与对象类型构造函数

Java:比较 3 个数字。获得其中最伟大的