我正在编写Socket程序,这里客户端通过Stream发送一个字符串,服务器处理它并写回客户端。我的问题是,服务器处理 String
后,它写回 Stream,但在客户端中它无法读取 Stream,它在 while: java.net.SocketException 中将其显示为 Exception :套接字关闭
这是我的代码,
客户端,
public void run() {
while (true) {
try {
// Open your connection to a server, at port 1231
s1 = new Socket("localhost", 1231);
OutputStream s1out = s1.getOutputStream();
DataOutputStream dos = new DataOutputStream(s1out);
InputStream in=s1.getInputStream();
DataInputStream dis=new DataInputStream(in);
String s = br.readLine();
dos.writeUTF(s);
dos.flush();
dos.close();
System.out.println(dis.readUTF());//it is the String from Server after processing
dis.close();
} catch (IOException ex) {
// Logger.getLogger(SimpleClient.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Exception in while: " + ex);
}
}
在服务器中
public void run()
{
while(true){
try {
System.out.println("Waiting for connect to client");
s1=serverSocket.accept();
s1In = s1.getInputStream();
dis = new DataInputStream(s1In);
out=s1.getOutputStream();
dos=new DataOutputStream(out);
String clientData=dis.readUTF();
//processing task String
dos.writeUTF("Bus Registered Successfully");
dos.flush();
}
}
在这里,我无法在客户端读取总线注册成功
。如何解决这个问题?
最佳答案
你的程序中有很多地方不对劲。但首先让我回答你的问题......你在写入流后关闭套接字......所以服务器抛出异常,只需在 dos 之后删除
。它将运行良好。dos.close();
.flush();
现在回到编程实践......
1) 服务器应该在 while(true)
循环中接受连接,然后创建一个新线程。因此以下语句不应该是 run
方法的一部分。
System.out.println("Waiting for connect to client");
s1=serverSocket.accept();
s1In = s1.getInputStream();
dis = new DataInputStream(s1In);
out=s1.getOutputStream();
dos=new DataOutputStream(out);
2)客户端
中不需要run
方法。因为每个新客户端都是一个新程序,有自己的变量
和套接字
。
关于java - 如何保持套接字连接直到服务器处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27918226/