java - 安卓利用Socket和PC通信无法连接?
PHP中文网
PHP中文网 2017-04-18 10:53:50
0
6
832
  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中文网

认证0级讲师

全員に返信(6)
迷茫

これは IP の問題であるはずです:

1. デバイスがエミュレータの場合: コンピュータのホストにアクセスするには、対応するエミュレータの IP アドレスを確認してください。通常、対応するエミュレータの公式 Web サイトで入手できます (具体的な IP アドレスはエミュレータによって異なります)。

  1. Genymotion: 10.0.3.2

  2. Androidエミュレータ: 10.0.2.2

2. デバイスが実機の場合は、携帯電話と実機が同じ LAN 内にあることを確認するのが最善です (ラップトップの場合は、携帯電話を使用してコンピューターの WiFi に接続することをお勧めします)アクセスする前に)cmdでIPアドレスを確認できます

いいねを押す +0
Peter_Zhu

以前にもこの問題に遭遇しました。クライアントのソケット接続コードを次のコードに変更してみてください。
クライアント:

リーリー
いいねを押す +0
Peter_Zhu

携帯電話と PC が同じ LAN 上にある場合は、ルーターでワイヤレス分離が有効になっているかどうかに注意する必要があります。これも落とし穴になる可能性があります。

いいねを押す +0
PHPzhong

エラーレポートを見ると、ソケットを UI スレッドで実行させましたか? ——Android では、Android 4.0 以降、UI スレッドでの Socket の使用が許可されず、Socket を使用するには新しいスレッドを開始する必要があります

いいねを押す +0
洪涛

NetworkOnMainThreadException、メイン スレッドでのソケット関連の操作が含まれていますか?
最初にコードを実行します。現在のクライアント コードが startClient() に記述されていると仮定すると、このコードを実行のために子スレッドに配置する必要があります。 リーリー

実際には、ビジネスコードに関連するこのスレッドとメインスレッド (UI スレッド) とのやり取りも処理する必要があります。

まずはメインスレッド (UI スレッド) の違い/関係を理解することをお勧めします。とサブスレッドを参照して、スレッド通信の実装を見てください。

いいねを押す +0
阿神

ログには「メインスレッド例外のネットワーク」と明記されています。上記のように、新しく開かれたスレッドを使用してネットワーク操作を実行しましょう。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!