开发者社区> 问答> 正文

Android手机连接socket服务器失败?报错

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






展开
收起
爱吃鱼的程序员 2020-06-09 14:55:14 1040 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    <divclass='ref'>

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

    <spanstyle="font-size:10pt;line-height:1.5;"><spanstyle="font-size:13.3333px;line-height:20px;background-color:#E53333;">br.readLine() 的结束应该是读取到null吧<spanstyle="font-size:10pt;line-height:1.5;"><spanstyle="font-size:13.3333px;line-height:20px;background-color:#E53333;">br.readLine() 的结束应该是读取到null吧回复<aclass='referer'target='_blank'>@用户3314186077:我实验了一下,确实是能工作的,但是不是android,你只有再看看咯执行时直接抛异常,根本就读不到,按说程序应该是阻塞在这一行的。java.net.SocketException:ConnectionresetConnectionresetatjava.net.SocketInputStream.read(UnknownSource)同样的代码用虚拟机没问题,上真机就不行,我也是被愁死了。

    2020-06-09 14:55:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载