java - 安卓利用Socket和PC通信无法连接?
问题描述
安卓利用Socket和PC通信无法连接
已经设置了 <uses-permission android:name='android.permission.INTERNET'/>
相同代码PC端和PC端通信没有问题
会在new Socket(ip,port)这里一直堵塞;
服务器代码
public ServiceThread(Socket s) throws IOException {socket = s;out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);in=socket.getInputStream(); } public void run() {try { out.println('SERVER DATA'); System.out.println('closing...'); byte[] temp = new byte[1024]; int length=-1; while((length=in.read(temp))>0){System.out.println(temp); } out.close(); socket.close();} catch (Exception e) {} }}public class MyServer { static final int PORT = 8778; public static void main(String[] args) throws IOException {ServerSocket s = new ServerSocket(PORT);System.out.println('Server 启动');Socket socket = s.accept();ServiceThread t = new ServiceThread(socket);t.start(); }}
客户端代码
Socket socket = null;BufferedWriter out = null;try { socket = new Socket(ip, 8778); out = new BufferedWriter(new OutputStreamWriter(socket .getOutputStream())); out.write(sendViewA.getText().toString());} catch (Exception e) { e.printStackTrace();} finally {
Socket socket = null;BufferedReader in = null;try { socket = new Socket(ip, 8778); in = new BufferedReader(new InputStreamReader(socket .getInputStream())); String fromServerStr = in.readLine(); Toast.makeText(OUTActivity.this,fromServerStr,Toast.LENGTH_LONG).show();} catch (Exception e) { e.printStackTrace();} finally {
问题解答
回答1:这里应该是ip的问题:
一、如果你的设备是模拟器:请核对相应的模拟器访问电脑主机的ip,一般相应模拟器的官网上有(具体的模拟器不同ip也不尽相同)
Genymotion:10.0.3.2
安卓模拟器:10.0.2.2
二、如果你的设备是真机,最好保证手机和真机在同一局域网(如果是笔记本电脑的话建议用手机连接电脑WiFi后访问),ip地址在cmd中自己查看即可
回答2:之前遇到过一次,客户端的socket连接的代码尝试换成下面的。客户端:
socket = new Socket();socket.connect(new InetSocketAddress('1.1.9.30',8080), 5000);回答3:
如果手机和PC都在同一个局域网了,那还需要注意一点,是不是路由器上面启用了无线隔离,这也可能是一个坑点。
回答4:看你的报错,你是不是让 Socket 跑在 UI 线程里面了?—— 安卓上的话,Android 4.0 之后,就不允许在 UI 线程中使用 Socket,需要启动新的线程来使用 Socket
回答5:NetworkOnMainThreadException, 是在主线程涉及Socket相关操作了吧?这里先让代码跑起来, 假设你现在的客户端代码写在 startClient()里面, 需要把这个代码放到子线程去执行:
new Thread(new Runnable() {@Overridepublic void run() { startClient();} }).start();
实际上, 你还要处理这个线程和主线程(UI线程)交互的问题, 这个就和业务代码相关了.建议先了解一下主线程(UI线程)和子线程的区别/联系, 然后看一下线程通讯的实现.
回答6:日志里面都明确写着“network on main thread exception”了啊,像楼上说的那样新开的线程进行网络操作吧
相关文章:
1. android - java tm platform se binary 占用很多内存2. Java中的多人游戏。将客户端(玩家)连接到其他客户端创建的游戏3. javascript - 关于js高级程序中的问题4. javascript - CSS图片轮播显示问题5. mysql 怎么做到update只更新一行数据?6. javascript - 项目用IE浏览器打开修改前端内容,后台数据修改了,但是前端页面内容不变,用谷歌浏览器测试前端页面可以刷新,求大神解决。7. thinkPHP5中获取数据库数据后默认选中下拉框的值,传递到后台消失不见。有图有代码,希望有人帮忙8. python - Mac 安装 MySQLdb时 报错,所有过程都按照网上说的做的,还是报错,求大神帮助9. datetime - Python如何获取当前时间10. 现在大家是用Mysql还是mariaDb?

网公网安备