安卓利用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 アドレスを確認してください。通常、対応するエミュレータの公式 Web サイトで入手できます (具体的な IP アドレスはエミュレータによって異なります)。
以前にもこの問題に遭遇しました。クライアントのソケット接続コードを次のコードに変更してみてください。
リーリークライアント:
携帯電話と PC が同じ LAN 上にある場合は、ルーターでワイヤレス分離が有効になっているかどうかに注意する必要があります。これも落とし穴になる可能性があります。
エラーレポートを見ると、ソケットを UI スレッドで実行させましたか? ——Android では、Android 4.0 以降、UI スレッドでの Socket の使用が許可されず、Socket を使用するには新しいスレッドを開始する必要があります
NetworkOnMainThreadException、メイン スレッドでのソケット関連の操作が含まれていますか?
実際には、ビジネスコードに関連するこのスレッドとメインスレッド (UI スレッド) とのやり取りも処理する必要があります。最初にコードを実行します。現在のクライアント コードが startClient() に記述されていると仮定すると、このコードを実行のために子スレッドに配置する必要があります。 リーリー
まずはメインスレッド (UI スレッド) の違い/関係を理解することをお勧めします。とサブスレッドを参照して、スレッド通信の実装を見てください。
ログには「メインスレッド例外のネットワーク」と明記されています。上記のように、新しく開かれたスレッドを使用してネットワーク操作を実行しましょう。