安卓利用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 {
Ini sepatutnya menjadi masalah IP:
1. Jika peranti anda ialah emulator: Sila semak IP emulator yang sepadan untuk mengakses hos komputer Secara amnya, ia tersedia di tapak web rasmi emulator yang sepadan (IP khusus emulator berbeza)
Genymotion: 10.0.3.2
Emulator Android: 10.0.2.2
2. Jika peranti anda adalah mesin sebenar, sebaiknya pastikan telefon mudah alih dan mesin sebenar berada dalam LAN yang sama (jika ia adalah komputer riba, adalah disyorkan untuk menggunakan telefon bimbit untuk menyambung ke WiFi komputer sebelum mengakses). Anda boleh menyemak alamat IP dalam cmd sendiri
Saya pernah mengalami perkara ini sebelum ini. Cuba tukar kod sambungan soket pelanggan kepada yang berikut.
Pelanggan:
Jika telefon mudah alih dan PC kedua-duanya berada pada LAN yang sama, anda perlu memberi perhatian sama ada pengasingan wayarles didayakan pada penghala Ini juga boleh menjadi perangkap.
Melihat laporan ralat anda, adakah anda membiarkan Soket berjalan dalam urutan UI? ——Pada Android, selepas Android 4.0, Socket tidak dibenarkan untuk digunakan dalam urutan UI dan urutan baharu perlu dimulakan untuk menggunakan Socket
NetworkOnMainThreadException, adakah ia melibatkan operasi berkaitan Soket dalam urutan utama?
Biar kod dijalankan dahulu untuk pelaksanaan :
Sebenarnya, anda juga perlu berurusan dengan interaksi antara utas ini dan utas utama (utas UI), yang berkaitan dengan kod perniagaan
Adalah disyorkan untuk memahami dahulu perbezaan/hubungan antara utas utama (benang UI) dan sub-benang , dan kemudian lihat pada pelaksanaan komunikasi benang.
Log dengan jelas menyatakan "rangkaian pada pengecualian utas utama". Mari gunakan utas yang baru dibuka untuk melaksanakan operasi rangkaian seperti yang dinyatakan di atas