我有一个名为IRCConnection
的对象,它实现Runnable
并包含Socket
。我使用Socket
连接到服务器,并在BufferedReader
的帮助下阅读输入。
我希望能够停止BufferedReader
以关闭套接字。
到目前为止我已尝试过的事情:
close()
方法插座对象的NPE running
设置为false
shutdownInput
的Socket =>插座对象的NPE volatile
个关键字添加到running
BufferedReader
扩展Thread而不是实现Runnable
public class IRCConnection implements Runnable {
private BufferedReader br;
private BufferedWriter bw;
private Socket ircSocket;
// constructor and other irrelevant methods
....
// relevant methods
public void run() {
// creating socket
ircSocket = new Socket();
try {
ircSocket.setSoTimeout(100);
// opening connection
ircSocket.connect(new InetSocketAddress(getServer(), getPort()));
br = new BufferedReader(new InputStreamReader(ircSocket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(ircSocket.getOutputStream()));
String inputLine;
while (isRunning()) {
inputLine = br.readLine();
if (inputLine != null) {
doSomething();
}
}
}
close();
} catch (IOException ie) {
log(ie);
}
}
public void close() {
if (ircSocket != null) {
if (ircSocket.isConnected()) {
setRunning(false);
try {
ircSocket.close();
} catch (IOException e) {
log(e);
}
}
}
}
}
我在另一个对象中创建了runnable,并使用Thread(irc).start()
启动Runnable来启动它。
我真的不明白我如何在两个线程中都有一个初始化和连接的Socket,或者至少能够在一个线程中停止它。
答案 0 :(得分:1)
调用Socket的
shutdownInput
这是正确答案。
=>插座对象的NPE
所以解决这个问题。当然你可以解决一个NPE?