安卓 2.3.3 API10以上) wifi发消息到上位机 socket最简单
一个最简单的demo,手机和电脑连上同一个路由器,向电脑的某个socket端口发送消息。适合业余玩玩。
用的技术点都是最简单粗暴的,不要用来开发产品。
在安卓2.3.3和5.1的真机上都测试通过。
使用方法:
sscom5.13.1.exe在电脑上开server不行,估计是被win10防火墙给挡了,其他的socket server软件也不好找。干脆用python,运行时弹出防火墙,点允许。
conda默认安装的base环境,socketserver time这种包就默认安装了。直接运行这个脚本就能行。电脑的IP是192.168.1.100 使用的端口是 9999
import socketserver import time class Handler(socketserver.BaseRequestHandler): def setup(self): """连接成功,塞入连接池""" # self.request.sendall("connect success!".encode(encoding='gbk')) # 向客户端发送连接成功信息 print("Connected by ", self.client_address) socket_request_pool.append(self.request) # 当前socket连接对象放入连接池 def handle(self): """ 收到消息处理,异常或空消息,断开连接,心跳则返回消息""" try: while True: self.data = self.request.recv(1024) print("online num", len(socket_request_pool)) print("{} rcv:".format(self.client_address)) print(self.data.decode(encoding="gbk")) if not self.data: print("Connection lost") self.remove() break # self.data_str = self.data.decode('GBK') # 接收到的数据从byte-->str ,gbk编码 # self.data_content = self.data_str.strip('$#') # 去掉首尾字符 # if len(self.data_content) == 6: # self.request.sendall(self.data) # 发送收到的内容,即心跳协议的响应 # time.sleep(2) # print("服务端发送心跳响应成功," + '终端号:' + self.data_content + ',' + time.strftime("%Y-%m-%d %H:%M:%S", # time.localtime())) except Exception as e: print(self.client_address, "Connection lost") self.remove() finally: self.request.close() def finish(self): """ 环境清理,在handle()之后执行清除操作,默认什么都不做, 如果setup()和handle()方法都不生成异常,则无需调用该方法""" print("client clean", self.client_address) def remove(self): """连接断开后,从连接池中删除socket对象""" print("client remove") socket_request_pool.remove(self.request) print("online num: ", len(socket_request_pool)) if __name__ == '__main__': ADDRESS = ('192.168.1.100', 9999) socket_request_pool = [] # 连接池 server = socketserver.ThreadingTCPServer(ADDRESS, Handler) server.serve_forever()
安卓源码:使用的android studio开发,SDK是API10,姜饼。
为了在一个10年前的手机上玩,三星5830,竟然还能用。
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.po.wifi23.MainActivity" tools:layout_editor_absoluteY="81dp" tools:layout_editor_absoluteX="0dp"> <Button android:id="@+id/btn_send" android:layout_width="135dp" android:layout_height="0dp" android:onClick="send0" android:text="send" android:layout_marginStart="8dp" tools:layout_constraintTop_creator="1" android:layout_marginTop="22dp" app:layout_constraintTop_toBottomOf="@+id/button_conn" tools:layout_constraintLeft_creator="1" app:layout_constraintLeft_toLeftOf="parent" android:layout_marginLeft="8dp" /> <Button android:id="@+id/button_conn" android:layout_width="0dp" android:layout_height="48dp" android:onClick="conn0" android:text="conn" android:layout_marginStart="8dp" tools:layout_constraintTop_creator="1" android:layout_marginTop="19dp" tools:layout_constraintLeft_creator="1" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginLeft="8dp" /> </android.support.constraint.ConstraintLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.po.wifi23"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
MainActivity.java
package com.example.po.wifi23; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private Socket socket; /** * 建立服务端连接 */ public void conn0(View v) { Toast.makeText(this, "conn0", Toast.LENGTH_SHORT).show(); new Thread() { @Override public void run() { try { socket = new Socket("192.168.1.100", 9999); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } /** * 发送消息 */ public void send0(View v) { Toast.makeText(this, "send0", Toast.LENGTH_SHORT).show(); new Thread() { @Override public void run() { try { // socket.getInputStream() DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); writer.writeUTF("hello server0"); // 写一个UTF-8的信息 } catch (IOException e) { e.printStackTrace(); } } }.start(); } }