【问题标题】:Java: How to set timeout on client socket connection and disconnect idle users?Java:如何设置客户端套接字连接超时并断开空闲用户?
【发布时间】:2016-02-07 17:30:39
【问题描述】:

你能告诉我如何在客户端套接字连接上设置超时吗?我已经下载了示例,但我根本不懂 Java,所以请帮忙。我希望我不会得到一堆可恨的cmets。 这是我的“客户”类:

import java.net.*;
import java.io.*;
import java.util.*;

public class Client  {

private ObjectInputStream sInput;       
private ObjectOutputStream sOutput;     
private Socket socket;

private ClientGUI cg;

private String server, username;
private int port;

Client(String server, int port, String username) {
    this(server, port, username, null);
}

Client(String server, int port, String username, ClientGUI cg) {
    this.server = server;
    this.port = port;
    this.username = username;
    this.cg = cg;
}

public boolean start() {
    try {
        Socket socket = new Socket();
    } 
    catch(Exception ec) {
        display("Error connectiong to server:" + ec);
        return false;
    }

    String msg = "Connection accepted " + socket.getInetAddress() + ":" + socket.getPort();
    display(msg);

    try
    {
        sInput  = new ObjectInputStream(socket.getInputStream());
        sOutput = new ObjectOutputStream(socket.getOutputStream());
    }
    catch (IOException eIO) {
        display("Exception creating new Input/output Streams: " + eIO);
        return false;
    }

    new ListenFromServer().start();
    try
    {
        sOutput.writeObject(username);
    }
    catch (IOException eIO) {
        display("Exception doing login : " + eIO);
        disconnect();
        return false;
    }
    return true;
}

private void display(String msg) {
    if(cg == null)
        System.out.println(msg);    
    else
        cg.append(msg + "\n");  
}

void sendMessage(ChatMessage msg) {
    try {
        sOutput.writeObject(msg);
    }
    catch(IOException e) {
        display("Exception writing to server: " + e);
    }
}

private void disconnect() {
    try { 
        if(sInput != null) sInput.close();
    }
    catch(Exception e) {} 
    try {
        if(sOutput != null) sOutput.close();
    }
    catch(Exception e) {} 
    try{
        if(socket != null) socket.close();
    }
    catch(Exception e) {} 

    if(cg != null)
        cg.connectionFailed();

}
public static void main(String[] args) {
    int portNumber = 1500;
    String serverAddress = "localhost";
    String userName = "Anonymous";

    switch(args.length) {
        case 3:
            serverAddress = args[2];
        case 2:
            try {
                portNumber = Integer.parseInt(args[1]);
            }
            catch(Exception e) {
                System.out.println("Invalid port number.");
                System.out.println("Usage is: > java Client [username] [portNumber] [serverAddress]");
                return;
            }
        case 1: 
            userName = args[0];
        case 0:
            break;
        default:
            System.out.println("Usage is: > java Client [username] [portNumber] {serverAddress]");
        return;
    }
    Client client = new Client(serverAddress, portNumber, userName);
    if(!client.start())
        return;

    Scanner scan = new Scanner(System.in);
    while(true) {
        System.out.print("> ");
        String msg = scan.nextLine();
        if(msg.equalsIgnoreCase("LOGOUT")) {
            client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
            break;
        }
        else if(msg.equalsIgnoreCase("WHOISIN")) {
            client.sendMessage(new ChatMessage(ChatMessage.WHOISIN, ""));               
        }
        else {          
            client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, msg));
        }
    }
    client.disconnect();    
}

class ListenFromServer extends Thread {

    public void run() {
        while(true) {
            try {
                String msg = (String) sInput.readObject();
                if(cg == null) {
                    System.out.println(msg);
                    System.out.print("> ");
                }
                else {
                    cg.append(msg);
                }
            }
            catch(IOException e) {
                display("Server has close the connection: " + e);
                if(cg != null) 
                    cg.connectionFailed();
                break;
            }
            catch(ClassNotFoundException e2) {
            }
        }
    }
}
}

【问题讨论】:

  • 始终先创建并刷新 ObjectOutputStream 以避免头部锁定。即输入流首先读取标头。
  • 如果您传递的只是字符串,我建议您使用更高效的 DataInputStream。您可以使用 readUTF() 和 writeUTF()
  • Socket socket = new Socket(); 未连接到服务器。它根本不会在网络上做任何事情。

标签: java sockets timeout session-timeout connection-timeout


【解决方案1】:

要设置超时,您可以使用

socket.setSoTimeout(timeInMillis);

注意:如果达到此超时,您会在读取时收到SocketTimeoutException,并且您需要关闭连接。

【讨论】:

  • @AleksandarAleksandrov 您的代码应该在创建 Socket 后设置它。注意:如果您以您的方式将socket 设为局部变量,它将被丢弃。您需要设置该字段,否则它毫无意义。当您遇到错误时,我建议您使用调试器来确保您拥有的代码有效。
猜你喜欢
  • 2019-07-14
  • 2015-07-28
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多