SocketTimeoutException: Read timed out请各位帮帮忙!!!

syc574937516 2014-06-30 05:08:45

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

//客户端
public class SocketClient {

public static void main(String[] args){
try {
Socket socket=new Socket("127.0.0.1",21112);
socket.setSoTimeout(10*1000);
DataInputStream in=new DataInputStream(new BufferedInputStream(socket.getInputStream()));
OutputStream out =socket.getOutputStream();
out.write("client".getBytes());
out.flush();
int r=0;
//数据不能读完,但是已经没有数据了
while((r=in.read())!=-1){
System.out.print((char)r);
}
System.out.println("end");
} catch (Exception e) {
e.printStackTrace();
}
}

}


import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class SocketServer {

public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(21112);
Socket socket=null;
socket=server.accept();
System.out.println("有客户端连接了");
DataOutputStream out=new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
InputStream in=socket.getInputStream();
out.write("server".getBytes());
out.flush();
int r=0;
while((r=in.read())!=-1){
System.out.print((char)r);
}
} catch (IOException e) {
e.printStackTrace();
}
}

}


先运行服务端,然后运行客户端,
服务端输出:有客户端连接了 client
客户端输出:server
超时后服务端错误为:java.net.SocketException: Connection reset
客户端错误为:java.net.SocketTimeoutException: Read timed out
按照网上方法试过还是不行,不知道问题在哪里?
...全文
1005 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
syc574937516 2014-06-30
  • 打赏
  • 举报
回复
谢谢版主的回答,输入不止一行。感谢提供的参考链接!
oh_Maxy 2014-06-30
  • 打赏
  • 举报
回复
问题似乎出在in.read()方法那里,会一直阻塞等待,结果超时了。 如果只是一行输入,可以如下操作:

//客户端
public class SocketClient {

    public static void main(String args[]) {

        try {
            Socket socket = new Socket("127.0.0.1", 21112);
            // 由系统标准输入设备构造BufferedReader对象
            PrintWriter os = new PrintWriter(socket.getOutputStream());
            // 由Socket对象得到输出流,并构造PrintWriter对象
            BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 由Socket对象得到输入流,并构造相应的BufferedReader对象
            String readline = "client";
                os.println(readline);
                // 将从系统标准输入读入的字符串输出到Server
                os.flush();
                // 刷新输出流,使Server马上收到该字符串
                System.out.println("Client:" + readline);
                // 在系统标准输出上打印读入的字符串
                System.out.println("Server:" + is.readLine());
                // 从Server读入一字符串,并打印到标准输出上
            os.close(); // 关闭Socket输出流
            is.close(); // 关闭Socket输入流
            socket.close(); // 关闭Socket
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

//服务端
public class SocketServer {

    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(21112);
            Socket socket = null;
            socket = server.accept();
            System.out.println("有客户端连接了");
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream());
            int r = -1;
            while ((r = in.read()) != -1) {
                System.out.print((char) r);
            }
            out.write("server");
            out.flush();
            out.close(); // 关闭Socket输出流
            in.close(); // 关闭Socket输入流
            socket.close(); // 关闭Socket
            server.close(); // 关闭ServerSocket
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
参考:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧