Java 在第一个SocketTimeoutException之后接收EOFEException
这是一个简单的TCP服务器echo和TCP客户端 如果我对以下行进行注释,则程序正在运行:Java 在第一个SocketTimeoutException之后接收EOFEException,java,sockets,networking,objectinputstream,eofexception,Java,Sockets,Networking,Objectinputstream,Eofexception,这是一个简单的TCP服务器echo和TCP客户端 如果我对以下行进行注释,则程序正在运行: st.setSoTimeout(WAITING_FOR_INPUT); 但是如果我使用这个套接字超时方法,那么我将首先得到一个InterruptedIOException,它仍然很好。但在下一次迭代中,我将得到一个EOFEException,这就是问题所在 我不明白,怎么了?请帮忙 CSimpleServer.java CSimpleClient.java 您是否尝试增加超时值,10毫秒是一个相当快的网
st.setSoTimeout(WAITING_FOR_INPUT);
但是如果我使用这个套接字超时方法,那么我将首先得到一个InterruptedIOException,它仍然很好。但在下一次迭代中,我将得到一个EOFEException,这就是问题所在
我不明白,怎么了?请帮忙
CSimpleServer.java
CSimpleClient.java
您是否尝试增加超时值,10毫秒是一个相当快的网络,取决于上下文 顺便说一句,我喜欢在常量的名称中加上单位,代码更可读 问候,, Stéphane如果出现EOFEException,则表示对等方关闭了连接,没有两种方法 我同意斯尼科拉斯的观点。10毫秒是一个荒谬的短超时。将其设置为至少5秒 您还应该在创建ObjectInputStream后设置超时
import java.io.*;
import java.net.*;
public class CSimpleServer
{
public static final int WAITING_FOR_INPUT = 10; // 10 ms
public CServerThread st;
public class CServerThread extends Thread
{
ServerSocket ss;
Socket st;
ObjectInputStream in;
ObjectOutputStream out;
int sleeping_time;
int port;
CServerThread(int port, int sleeping_time)
{
st = null;
in = null;
out = null;
this.port = port;
this.sleeping_time = sleeping_time;
}
public void run()
{
try {
ss = new ServerSocket(port);
}
catch (IOException ioe) {
System.err.println("Create server failed: " + ioe.getMessage());
return;
}
try {
st = ss.accept();
st.setSoTimeout(WAITING_FOR_INPUT);
out = new ObjectOutputStream(st.getOutputStream());
out.flush();
in = new ObjectInputStream(st.getInputStream());
}
catch (IOException ioe) {
System.err.println("Catch connection failed: " + ioe.getMessage());
return;
}
while (true) {
try {
int i_data = in.readInt();
if (i_data == 0) {
break;
}
System.out.println("Get: " + i_data);
out.writeInt(i_data);
out.flush();
out.reset();
sleep(sleeping_time);
}
catch (InterruptedIOException ire) {
System.out.println("Read data timeout."); // for debug
continue;
}
catch (EOFException eof) {
System.err.println("Reach end of stream: " + eof.getMessage());
break;
}
catch (IOException ioe) {
System.err.println("Read data failed: " + ioe.getMessage());
break;
}
catch (InterruptedException ire) {
System.err.println("Something interrupted this thread: " + ire.getMessage());
}
}
try {
in.close();
out.close();
st.close();
ss.close();
}
catch (IOException ioe) {
System.err.println("Close server failed: " + ioe.getMessage());
return;
}
}
}
CSimpleServer()
{
st = null;
}
public static void main(String[] args)
{
CSimpleServer prog = new CSimpleServer();
prog.st = prog.new CServerThread(3800, 1000);
prog.st.start();
}
}
import java.io.*;
import java.net.*;
public class CSimpleClient
{
public CClientThread ct;
public class CClientThread extends Thread
{
Socket st;
ObjectInputStream in;
ObjectOutputStream out;
int port;
CClientThread(int port)
{
st = null;
in = null;
out = null;
this.port = port;
}
public void run()
{
try {
st = new Socket(InetAddress.getLocalHost(), port);
out = new ObjectOutputStream(st.getOutputStream());
out.flush();
in = new ObjectInputStream(st.getInputStream());
}
catch (UnknownHostException uhe) {
System.err.println("Unknown server: " + uhe.getMessage());
return;
}
catch (IOException ioe) {
System.err.println("Connect to server failed: " + ioe.getMessage());
return;
}
BufferedReader ink = new BufferedReader(new InputStreamReader(System.in));
while (true) {
try {
String s = ink.readLine();
int i_data = Integer.valueOf(s);
out.writeInt(i_data);
out.flush();
out.reset();
if (i_data == 0) {
ink.close();
break;
}
i_data = in.readInt();
System.out.println("Echo: " + i_data);
}
catch (IOException ioe) {
System.err.println("Send/read data failed: " + ioe.getMessage());
break;
}
}
try {
in.close();
out.close();
st.close();
}
catch (IOException ioe) {
System.err.println("Close client failed: " + ioe.getMessage());
return;
}
}
}
CSimpleClient()
{
ct = null;
}
public static void main(String[] args)
{
CSimpleClient prog = new CSimpleClient();
prog.ct = prog.new CClientThread(3800);
prog.ct.start();
}
}