我用自己的电脑写了一个socket服务器,又写了一个客户端。在自己的电脑上用客户端与服务器交互没有问题。但到了手机上总连接不上,而服务器也接收到了手机的连接请求。
服务器代码
//--1.提供服务
try {
//--端口的取值范围 0 and 65535,
ServerSocket ss= new ServerSocket(110);
System.out.println("Success");
} catch (IOException e) {
//--失败的原因..端口被占用
System.out.println("启动服务失败");
}
try {
//--2.等待客户端绑定.该方法是阻塞方法.
s = ss.accept();
//--getInetAddress 获取绑定服务端成功的客户端的IP地址.
System.out.println("客户端绑定成功" + s.getInetAddress());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//--服务启动成功,客户端绑定成功.下面通过Socket对象进行通信.
BufferedReader br = null;//--用于从Socket读取客户端发送的内容
PrintWriter pw = null;//--用于从服务端向客户端发送消息
BufferedReader brInput = null;//--用于获取服务端控制台录入的内容
String line = null; //--保存读取到的从客户端发送给服务端的内容
try {
//--因为文本通信使用字符流.Socket中获取的是字节流.通过转换流(InputStreamReader)把从Socket中获取的字节流转换成需要使用的字符流
InputStream is=s.getInputStream();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
pw = new PrintWriter(s.getOutputStream());
brInput = new BufferedReader(new InputStreamReader(System.in));
//--- 读取客户端发送的内容时报错
while(!(line = br.readLine()).equals("byebye")){
System.out.println("Clinet:" + line);
System.out.println("Server Enter:");
line = brInput.readLine();
pw.write(line);
pw.println();
pw.flush();
}
pw.write("See You Tomorrow");
pw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
br.close();
brInput.close();
pw.close();
}
客户端代码
// --1. 提供Socket对象
try {
socket = new Socket();
socket.connect(new InetSocketAddress("192.168.0.8",110), 3000);
// --2.获取3个流对象
br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream());
brInput = new BufferedReader(new InputStreamReader(System.in));
while (true) {
// --3.客户端向服务端发送内容
System.out.println("输入内容发送给服务器");
line= brInput.readLine();
pw.write(line);
pw.println();
pw.flush();
//--接收服务端的内容
line = br.readLine();
if(line.equals("See You Tomorrow")){
break;
}
System.out.println("Server:" + line);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
pw.close();
br.close();
brInput.close();
}
报错
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
就是在手机客户端刚连接上时,程序应该是阻塞在br.readLine()这一行的,但是程序直接执行下去了,但此时客户端并未发送数据。因此br.readLine()是读不到的。如果是用电脑上的客户端连接的话没有问题,程序会阻塞在br.readLine()这一行 等待用户输入。
<divclass='ref'>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。