>  Q&A  >  본문

java - 安卓利用Socket和PC通信无法连接?

  1. 安卓利用Socket和PC通信无法连接

  2. 已经设置了 <uses-permission android:name="android.permission.INTERNET"/>

  3. 相同代码PC端和PC端通信没有问题

  4. 会在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 {
PHP中文网PHP中文网2716일 전838

모든 응답(6)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-18 10:55:50

    IP 문제여야 합니다.

    1. 장치가 에뮬레이터인 경우: 컴퓨터 호스트에 액세스하려면 해당 에뮬레이터의 IP 주소를 확인하세요. 일반적으로 해당 에뮬레이터의 공식 웹사이트에서 사용할 수 있습니다(에뮬레이터마다 구체적인 IP 주소가 다릅니다). )

    1. 지니모션: 10.0.3.2

    2. 안드로이드 에뮬레이터: 10.0.2.2

    2. 기기가 실제 기기인 경우 휴대폰과 실제 기기가 동일한 LAN에 있는지 확인하는 것이 가장 좋습니다. (노트북인 경우 휴대폰을 사용하여 연결하는 것이 좋습니다. 컴퓨터 WiFi 접속 전) cmd에서 직접 IP 주소를 확인하실 수 있습니다

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:55:50

    이전에 한 번 이런 문제가 발생했습니다. 클라이언트의 소켓 연결 코드를 다음과 같이 변경해 보세요.
    클라이언트:

    으아아아

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:55:50

    휴대폰과 PC가 모두 동일한 LAN에 있는 경우 라우터에서 무선 격리가 활성화되어 있는지 주의해야 합니다.

    회신하다
    0
  • PHPz

    PHPz2017-04-18 10:55:50

    오류 보고서를 보면 소켓이 UI 스레드에서 실행되도록 했나요? ——Android의 경우 Android 4.0 이후에는 UI 스레드에서 Socket 사용이 허용되지 않으며, Socket을 사용하려면 새 스레드를 시작해야 합니다

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:55:50

    NetworkOnMainThreadException, 메인 스레드에 소켓 관련 작업이 포함되어 있나요?
    코드를 먼저 실행해 보세요. 현재 클라이언트 코드가 startClient()에 작성되었다고 가정하면 이 코드를 하위 스레드에 넣어야 합니다. :

    으아아아

    사실 이 스레드와 비즈니스 코드와 관련된 메인 스레드(UI 스레드) 간의 상호 작용도 처리해야 합니다.
    먼저 메인 스레드 간의 차이점/관계를 이해하는 것이 좋습니다. (UI 스레드) 및 하위 스레드를 살펴보고 스레드 통신 구현을 살펴봅니다.

    회신하다
    0
  • 阿神

    阿神2017-04-18 10:55:50

    로그에는 "메인 스레드 예외의 네트워크"라고 명확하게 나와 있습니다. 위에서 언급한 대로 새로 열린 스레드를 사용하여 네트워크 작업을 수행하겠습니다

    회신하다
    0
  • 취소회신하다