Java:如何在客户端套接字连接上设置超时并断开空闲用户?

时间:2016-02-07 17:30:39

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

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

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) {
            }
        }
    }
}
}

1 个答案:

答案 0 :(得分:1)

要设置超时,您可以使用

socket.setSoTimeout(timeInMillis);

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