0.前言
笔者在使用Android真机与PC进行Socket通信,以android为客户端,PC端为服务器端时,踩了一下午坑,特此记录bug。
Android版本:7.1.2
手机和PC连接同一WIFI
1.PC服务端
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
private static void initServer() {
ServerSocket serverSocket = null;
try{
serverSocket = new ServerSocket(50000);
System.out.println("Server is running");
while(true){
Socket client = serverSocket.accept();
System.out.println("Accept new connection from "+client.getInetAddress()+":"+client.getPort());
//...
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
serverSocket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
public static void main(String [] args){
initServer();
}
}
首先在PC上运行上述代码。可查看端口使用状况:
2.Android客户端
记得在AndroidManifest.xml里加权限,以防万一,先加5个吧。
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
2.1 ConnectThread.java
import java.net.Socket;
public class ConnectThread extends Thread{
Socket socket =null;
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+": Hello");
try{
socket = new Socket("192.168.x.x",50000);
}catch (Exception e){
e.printStackTrace();
}
}
}
Android4.0以后不能在主线程里进行socket的连接,故在子线程里进行socket的连接。这个IP地址要填服务器端的IP地址,端口号和服务器端的端口号一致。
就因为这个IP地址就踩了很久的坑,有用过在百度搜索ip显示的IP地址:
也有在cmd里用ipconfig查IP地址:
等等。
事实证明,是上图第3
个IP地址。
2.2 MainActivity.java
//package com.example.simplechatroom;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
ConnectThread ct = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
ct = new ConnectThread();
ct.start();
//...
}
private void initView() {
//...
}
}
创建子线程进行连接测试。
3.测试
前面已经运行了服务器端,然后在手机上打开下载的APP即可,连接成功。顺带提一句,下面得到的是手机的IP地址,笔者的手机可在设置-更多设置-关于手机
里查到IP地址
再在PC上查看一下端口占用情况:
🌸 🌸OKOK连接成功,舒服了,完结撒花 🌸 🌸
4.后记
手机开热点供PC连接也可以,不过IP地址变了记得改
整个简易聊天室的代码完成后再上传~
聊天:
传文件:
详情请参考我的简书链接:基于Socket通信的Android聊天室(可互传文件)