树莓派与Android客户端进行socket通信
转自:https://blog.csdn.net/lj779323436/article/details/79911322
我在此基础上时间并进行了些许修正。
先在树莓派上创建热点:
https://blog.csdn.net/fm0517/article/details/80939113
在树莓派上编写脚本代码:tcpserver.py
#!/usr/bin/python
#coding=utf-8
import socket
import time
import sysHOST_IP = "192.168.12.1" #我的树莓派作为AP热点的ip地址
HOST_PORT = 7654 #端口号print("Starting socket: TCP...")
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socketprint("TCP server listen @ %s:%d!" %(HOST_IP, HOST_PORT) )
host_addr = (HOST_IP, HOST_PORT)
socket_tcp.bind(host_addr) #绑定我的树莓派的ip地址和端口号
socket_tcp.listen(1) #listen函数的参数是监听客户端的个数,这里只监听一个,即只允许与一个客户端创建连接while True:print ('waiting for connection...')socket_con, (client_ip, client_port) = socket_tcp.accept() #接收客户端的请求print("Connection accepted from %s." %client_ip)socket_con.send("Welcome to RPi TCP server!") #发送数据while True:data=socket_con.recv(1024) #接收数据if data: #如果数据不为空,则打印数据,并将数据转发给客户端print(data)socket_con.send(data)socket_tcp.close()
用AndroidStudio创建安卓工程MyApplication:
1.activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"android:orientation="vertical"tools:context="lh.wifidemo.ui.activity.Device_Control_Activity"><TextView
android:layout_width="match_parent"android:layout_height="wrap_content"android:text="设备控制"/><EditText
android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/et_send"/><Button
android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送"android:id="@+id/bt_send"/><TextView
android:layout_width="match_parent"android:layout_height="wrap_content"android:text="接收到的信息:"/><TextView
android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/tv_recv"/>
</LinearLayout>
2.MainActivity.java
package com.example.chenth.myapplication;import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;/*import com.example.chenth.myapplication.R;*/public class MainActivity extends AppCompatActivity {private EditText et_send;private Button bt_send;private TextView tv_recv;private String send_buff=null;private String recv_buff=null;private Handler handler = null;Socket socket = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();handler = new Handler();//单开一个线程来进行socket通信new Thread(new Runnable() {@Overridepublic void run() {try {socket = new Socket("192.168.12.1" , 7654);if (socket!=null) {System.out.println("###################");while (true) { //循环进行收发recv();send();Thread.sleep(50);}}elseSystem.out.println("socket is null");} catch (Exception e) {e.printStackTrace();}}}).start();send();}private void recv() {//单开一个线程循环接收来自服务器端的消息InputStream inputStream = null;try {inputStream = socket.getInputStream();} catch (IOException e) {e.printStackTrace();}if (inputStream!=null){try {byte[] buffer = new byte[1024];int count = inputStream.read(buffer);//count是传输的字节数recv_buff = new String(buffer);//socket通信传输的是byte类型,需要转为String类型System.out.println(recv_buff);} catch (IOException e) {e.printStackTrace();}}//将受到的数据显示在TextView上if (recv_buff!=null){handler.post(runnableUi);}}//不能在子线程中刷新UI,应为textView是主线程建立的Runnable runnableUi = new Runnable() {@Overridepublic void run() {tv_recv.append("\n"+recv_buff);}};private void send() {bt_send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {send_buff = et_send.getText().toString();//向服务器端发送消息System.out.println("------------------------");OutputStream outputStream=null;try {outputStream = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}if(outputStream!=null){try {outputStream.write(send_buff.getBytes());System.out.println("1111111111111111111111");outputStream.flush();} catch (IOException e) {e.printStackTrace();}}}}).start();}});}private void initView() {et_send = (EditText) findViewById(R.id.et_send);bt_send = (Button) findViewById(R.id.bt_send);tv_recv = (TextView) findViewById(R.id.tv_recv);}
}
3. AndroidManifest.xml
主要是增加了网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.chenth.myapplication"><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"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
这里有几个地方需要特别注意:
1、创建socket时需要开一个子线程,而不能直接在主线程中完成,否则会报错
2、当接收来自树莓派服务器的消息时,需要刷新TextView,而刷新TextView的操作不能直接在子线程中完成,需要用Handler来实现,否则会报错,提示view只能由源线程来更改
整个项目需要先启动树莓派,然后手机连上树莓派的WIFI热点,如果想要查看树莓派的输出信息,则可以利用window的远程桌面连接树莓派,也可以用putty这个软件进行命令行控制,当然,有条件的完全可以用HDMI接口给你的树莓派连一个显示器
最后上图:
图1.树莓派上的程序运行:
图2.手机上的程序运行:
树莓派与Android客户端进行socket通信相关推荐
- 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互
基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...
- Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发送文字数据
案例实现的是简单的Socket通信,当客户端(Android客户端)连接到指定服务器以后,服务器向客户端发送一句话文字信息(你可以拓展其它的了) 先看一下服务端程序的实现吧 Server.java i ...
- Android中关于Socket通信数据大小,内存缓冲区和数据可靠性的一点调查
关于TCP和UDP Socket通信的区别: 应用场景: UDP传输协议效率高,但不可靠: TCP传输效率低,但可靠. 传输数据大小: UDP传输数据限定在64K以下: TCP传输数据无大小限制,可进 ...
- Android进程间通信之socket通信
用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...
- java服务端与Android客户端使用 websocket 通信
最近因为项目需要所以得使用 websocket 来进行服务器与客户端的通信.使用java 来实现服务端,Android 实现客户端. 刚开始服务端使用 @ServerEndPoint 注解来实现 We ...
- Android开发之Socket通信的方法
老套图上图: 如上所示: 我这边定义了两个APP一个是server端一个是客户端 步骤: 先安装服务端APP,再安装客户端APP,然后打开客户端APP后悔自动打开服务端的service然后开启服务端的 ...
- Android服务的通信方式,android客户端与服务器通信的HTTP通信
如下,给出HTTP通信的主要代码: 一.post方式通信 主要分为以下几步: 1.新建Httppost对象: 2.为Httppost设置参数和编码格式: 3.新建HttpClient对象: 4.新建H ...
- Android客户端与PC服务器实现Socket通信(wifi)
转载自:http://www.cnblogs.com/dwayne/archive/2012/05/22/Android_pc_wifi_socket.html 本文介绍Android终端持续扫描AP ...
- Android客户端与PC服务器实现Socket通信
Android终端持续扫描AP信息并发送给服务器端的实现.首先基于TCP协议在Android终端和PC两端之间形成网络虚拟链路.使用ServerSocket创建TCP服务器端,然后在Android客户 ...
最新文章
- Documentum常见问题2—压力测试时一旦用户数超过一定数量就不能登录了
- tornado 表单 post 提交
- 一篇文章教会你使用html+css3制作GIF图
- 在GridView中加入单选按钮RadioButton
- Spring Bean生命周期-obtainFreshBeanFactory(三)
- 【12-05】面试题
- springBoot+springSecurity 数据库动态管理用户、角色、权限
- 三实系统地址是什么意思_终于明白!火灾报警系统的余量应该如何设置?地址数又是什么?...
- 正则表达式修正符的学习
- 增广拉格朗日 matlab,大连理工优化方法增广拉格朗日方法MATLAB程序
- 每个叶子节点(nil)是黑色。_129. 求根到叶子节点数字之和
- 一个winform中多线程的例子
- R 和 Python用于统计学分析,哪个更好?
- 【CSDN】博文导入微信公众号
- 13天Java进阶笔记-day11-网络编程和NIO
- ih5连接mysql数据库_iH5高级教程:H5数据应用,多种数据的判断
- 4G路由 linux,DIY低成本4G路由器:性能高,易于开发和应用
- 腾讯华为签署《深圳市APP个人信息保护自律承诺书》举措新解读
- Node Sass could not find a binding for your current environment
- 智博通 ZBT WG2626原机编程器
热门文章
- 姍姍遲來的iPhone文檔處理功能
- Java 使用List集合实现图书增删改查
- HDU 1297 Children’s Queue
- 牛客第四次多校Maximum Mode
- Linux centosVMware shell中的函数、shell中的数组、
- 学生选课数据库MySQL语句练习题45道
- 荣耀 6 安装 SD 卡,提示:SD卡已安全移除
- SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
- ECMAScript5之Object学习笔记(二)
- Ubuntu配置上位机Blackfin开发环境手记