安卓 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();
    }
}

 

posted @ 2022-09-27 23:27  园友1683564  阅读(148)  评论(0编辑  收藏  举报