【发布时间】:2014-03-26 15:34:54
【问题描述】:
我已经建立了一个网络,并且我已经将读写流设置为一个套接字:
//Set up socket reads and writes
final BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
final PrintWriter out = new PrintWriter(
client.getOutputStream(), true);
我想将两个变量“in”和“out”作为另一个类的构造函数的参数传递。这是它在其他类中的样子
BufferedReader in;
PrintWriter out;
public ClientThread(BufferedReader in, PrintWriter out) {
this.in = in;
this.out = out;
}
然后我想像这样使用这些类变量写入同一个套接字的输出流(该类实现 Runnable):
public void run() {
while (true) {
try {
String userCommand = in.readLine();
} catch (IOException e) {
// Die if something goes wrong.
System.err.println(e.toString());
System.exit(1);
}
}
}
但是,每当代码到达这一点时,我都会收到一个 SocketException:
java.net.SocketException: Socket closed
我该如何解决这个问题?我想将服务器和套接字的设置与客户端给出的任何命令的处理分开。
编辑:这是 BufferedRead 从中获取输入的内容
//create server socket
ServerSocket server = new ServerSocket(portNum);
// Accept a client if it appears
Socket client = server.accept();
编辑 2:我使用了这三个文件:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//Change the socket if it doesn't work
Socket sock = new Socket("localhost", 5920);
//keyboard
final BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
//input from socket
final BufferedReader in = new BufferedReader(
new InputStreamReader(sock.getInputStream()));
//writer to socket
final PrintWriter out = new PrintWriter(
sock.getOutputStream(), true);
//new thread for incoming messages
(new Thread(){
@Override
public void run() {
String serverMessage;
try {
while ((serverMessage = in.readLine()) != null) {
System.out.println(serverMessage);
}
} catch (IOException e) {
System.err.println("Something went wrong whilst trying "
+ "to retrieve a message from the server");
System.exit(-1);
}
}
}).start();
//new thread for outgoing messages
(new Thread(){
@Override
public void run() {
String clientMessage;
try {
while ((clientMessage = stdin.readLine()) != null) {
out.println(clientMessage);
}
} catch (IOException e) {
System.err.println("Something went wrong whilst trying "
+ "to send a message to the server.");
System.exit(-1);
}
}
}).start();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(5920);
Socket client = server.accept();
//Set up socket reads and writes
final BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
final PrintWriter out = new PrintWriter(
client.getOutputStream(), true);
new Thread(new ClassWithParam(in, out)).start();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
public class ClassWithParam implements Runnable {
BufferedReader in;
PrintWriter out;
public ClassWithParam(BufferedReader in, PrintWriter out) {
this.in = in;
this.out = out;
}
@Override
public void run() {
while (true) {
try {
System.out.println("HERE");
String userCommand = in.readLine();
System.out.println("HERE2");
} catch (IOException e) {
// Die if something goes wrong.
System.err.println(e.toString());
System.exit(1);
}
}
}
}
现在它可以工作了。不知道发生了什么。将继续用头撞墙。谢谢。
【问题讨论】:
-
嗯,大概连接已经关闭。这与在构造函数中使用 BufferedReader 无关。我们目前无法真正帮助您,因为我们对连接的内容一无所知。
-
这有帮助吗? //创建服务器套接字 ServerSocket server = new ServerSocket(portNum); // 如果出现就接受一个客户端 Socket client = server.accept();
-
不是真的...我们仍然没有足够的上下文,所有信息都应该在 question 中,而不是在 cmets 中。理想情况下,您应该展示一个简短但完整的程序(或更可能是一对程序),我们可以使用它来重现问题。
-
等一下,我会整理一些东西
-
@JonSkeet 当我重新创建代码时问题就消失了(这是问题所在),现在我讨厌自己。
标签: sockets networking bufferedreader socketexception