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