Android手机连接socket服务器失败

用户3314186077 发布于 2016/05/03 20:07
阅读 907
收藏 0

我用自己的电脑写了一个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()这一行 等待用户输入。






加载中
0
用户3314186077
用户3314186077

引用来自“阿信sxq”的评论

br.readLine()的结束应该是读取到null吧
执行时直接抛异常,根本就读不到,按说程序应该是阻塞在这一行的。
java.net.SocketException: Connection reset
Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at com.bishe.myserversocket.AndroidServer.run(AndroidServer.java:29)
at java.lang.Thread.run(Unknown Source)
同样的代码用虚拟机没问题,上真机就不行,我也是被愁死了。

0
阿信sxq
阿信sxq
br.readLine()的结束应该是读取到null吧
阿信sxq
阿信sxq
回复 @用户3314186077 : 我实验了一下,确实是能工作的,但是不是android,你只有再看看咯
用户3314186077
用户3314186077
执行时直接抛异常,根本就读不到,按说程序应该是阻塞在这一行的。 java.net.SocketException: Connection reset Connection reset at java.net.SocketInputStream.read(Unknown Source) 同样的代码用虚拟机没问题,上真机就不行,我也是被愁死了。
返回顶部
顶部