安卓利用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 문제여야 합니다.
1. 장치가 에뮬레이터인 경우: 컴퓨터 호스트에 액세스하려면 해당 에뮬레이터의 IP 주소를 확인하세요. 일반적으로 해당 에뮬레이터의 공식 웹사이트에서 사용할 수 있습니다(에뮬레이터마다 구체적인 IP 주소가 다릅니다). )
지니모션: 10.0.3.2
안드로이드 에뮬레이터: 10.0.2.2
2. 기기가 실제 기기인 경우 휴대폰과 실제 기기가 동일한 LAN에 있는지 확인하는 것이 가장 좋습니다. (노트북인 경우 휴대폰을 사용하여 연결하는 것이 좋습니다. 컴퓨터 WiFi 접속 전) cmd에서 직접 IP 주소를 확인하실 수 있습니다
PHPz2017-04-18 10:55:50
오류 보고서를 보면 소켓이 UI 스레드에서 실행되도록 했나요? ——Android의 경우 Android 4.0 이후에는 UI 스레드에서 Socket 사용이 허용되지 않으며, Socket을 사용하려면 새 스레드를 시작해야 합니다
PHP中文网2017-04-18 10:55:50
NetworkOnMainThreadException, 메인 스레드에 소켓 관련 작업이 포함되어 있나요?
코드를 먼저 실행해 보세요. 현재 클라이언트 코드가 startClient()에 작성되었다고 가정하면 이 코드를 하위 스레드에 넣어야 합니다. :
사실 이 스레드와 비즈니스 코드와 관련된 메인 스레드(UI 스레드) 간의 상호 작용도 처리해야 합니다.
먼저 메인 스레드 간의 차이점/관계를 이해하는 것이 좋습니다. (UI 스레드) 및 하위 스레드를 살펴보고 스레드 통신 구현을 살펴봅니다.
阿神2017-04-18 10:55:50
로그에는 "메인 스레드 예외의 네트워크"라고 명확하게 나와 있습니다. 위에서 언급한 대로 새로 열린 스레드를 사용하여 네트워크 작업을 수행하겠습니다