安卓利用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 {
迷茫2017-04-18 10:55:50
这里应该是ip的问题:
一、如果你的设备是模拟器:请核对相应的模拟器访问电脑主机的ip,一般相应模拟器的官网上有(具体的模拟器不同ip也不尽相同)
Genymotion:10.0.3.2
安卓模拟器:10.0.2.2
二、如果你的设备是真机,最好保证手机和真机在同一局域网(如果是笔记本电脑的话建议用手机连接电脑WiFi后访问),ip地址在cmd中自己查看即可
天蓬老师2017-04-18 10:55:50
之前遇到过一次,客户端的socket连接的代码尝试换成下面的。
客户端:
socket = new Socket();
socket.connect(new InetSocketAddress("1.1.9.30",8080), 5000);
PHPz2017-04-18 10:55:50
看你的报错,你是不是让 Socket 跑在 UI 线程里面了?—— 安卓上的话,Android 4.0 之后,就不允许在 UI 线程中使用 Socket,需要启动新的线程来使用 Socket
PHP中文网2017-04-18 10:55:50
NetworkOnMainThreadException, 是在主线程涉及Socket相关操作了吧?
这里先让代码跑起来, 假设你现在的客户端代码写在 startClient()里面, 需要把这个代码放到子线程去执行:
new Thread(new Runnable() {
@Override
public void run() {
startClient();
}
}).start();
实际上, 你还要处理这个线程和主线程(UI线程)交互的问题, 这个就和业务代码相关了.
建议先了解一下主线程(UI线程)和子线程的区别/联系, 然后看一下线程通讯的实现.