我在java中創建了一個到服務器的套接字,並且在套接字連接之後它創建了一個可以訪問套接字輸入和輸出流的新線程,然後此線程在它們到來時阻止並處理輸入行in。在java中處理套接字
據我所知,當輸入流結束時,BufferedReader上的readln
方法將返回null。這並不一定意味着套接字是封閉的,但它呢?這是什麼意思?所以我想要在套接字上運行close
方法來很好地關閉它。
我也明白,readln
方法可以拋出一個IOException,並且在套接字上調用close
方法(如果它當前被阻塞)後拋出。什麼時候可以拋出?插入後仍然可以打開它,或者它會一直關閉並準備好進行垃圾回收等。
這是我現在的代碼,我真的不知道如何正確處理斷開連接。目前我認爲如果在套接字正在等待線路時調用disconnect
方法,則可能最終陷入死鎖,因爲disconnect
將在套接字上調用close
。然後這將把IOException
放在readLine
上,然後這將導致該catch塊再次調用disconnect
。
public class SocketManager {
private Socket socket = null;
private PrintWriter out = null;
private BufferedReader in = null;
private String ip;
private int port;
private Object socketLock = new Object();
public SocketManager(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void connect() throws UnableToConnectException, AlreadyConnectedException {
synchronized(socketLock) {
if (socket == null || socket.isClosed()) {
throw (new AlreadyConnectedException());
}
try {
socket = new Socket(ip, port);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
throw (new UnableToConnectException());
}
new Thread(new SocketThread()).start();
}
}
public void disconnect() throws NotConnectedException {
synchronized(socketLock) {
if (isConnected()) {
throw (new NotConnectedException());
}
try {
socket.close();
} catch (IOException e) {}
}
}
public boolean isConnected() {
synchronized(socketLock) {
return (socket != null && !socket.isClosed());
}
}
private class SocketThread implements Runnable {
@Override
public void run() {
String inputLine = null;
try {
while((inputLine = in.readLine()) != null) {
// do stuff
}
if (isConnected()) {
try {
disconnect();
} catch (NotConnectedException e) {}
}
} catch (IOException e) {
// try and disconnect (if not already disconnected) and end thread
if (isConnected()) {
try {
disconnect();
} catch (NotConnectedException e1) {}
}
}
}
}
}
我基本上想知道達到以下的最佳方式:編寫一個連接到插座,並啓動一個單獨的線程監聽輸入連接方法
- 。
- 編寫一個從套接字斷開並終止正在偵聽輸入的線程的斷開連接方法。
- 處理與遠程套接字連接中斷的情況。
我已通讀java tutorial on sockets,但在我看來,它並沒有真正涵蓋這些細節。
謝謝!