首页 文章 精选 留言 我的

精选列表

搜索[通信框架],共10000篇文章
优秀的个人博客,低调大师

Flutter与Android通信方式->BasicMessageChannel方式(发送消息并且返回结果)

摘要:Flutter版本号:1.12.13,Kotlin版本号:1.3.72 版本号不同,实现的方式不一样,所以特此标注下。 具体的实现原理,自行查阅。这里只写代码实现过程,主要原因是网上Kotlin的实现方式实在太少,特此记录。 Flutter: import 'package:base_library/base_library.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class ChannelDemoPage extends StatefulWidget { @override _ChannelDemoPageState createState() => _ChannelDemoPageState(); } class _ChannelDemoPageState extends State<ChannelDemoPage> { static const _channel = const MethodChannel('plugins.flutter.io/FlutterMessagePlugin'); static const eventChannel = EventChannel('plugins.flutter.io/FlutterEventPlugin'); static const _basicMessageChannel = BasicMessageChannel( 'plugins.flutter.io/FlutterBasicMessageChannel', StringCodec()); @override void initState() { super.initState(); eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError); // ignore: missing_return _basicMessageChannel.setMessageHandler((String message) { LogUtil.e("Flutter收到Android发来Basic消息->, $message"); }); } void _onEvent(Object event) { LogUtil.e("Flutter收到Android发来的消息-> " + event.toString()); } void _onError(Object error) { LogUtil.e("错误:" + error.toString()); } @override Widget build(BuildContext context) { return new Scaffold( body: new Row(), floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, floatingActionButton: new FloatingActionButton( backgroundColor: Colors.blueAccent, onPressed: () { this.getResult(); }, child: new Icon(Icons.adb), ), ); } void getResult() async { try { Map<String, Object> map = {"shareUrl": "https://www.baidu.com"}; var result = await _channel.invokeMethod("getRealUrl", map); LogUtil.e("result->$result"); } catch (e) { LogUtil.e("e->, $e"); } } } Kotlin: import android.content.Context import android.util.Log import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.BasicMessageChannel import io.flutter.plugin.common.BasicMessageChannel.MessageHandler import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.StringCodec class FlutterBasicMessageChannel : FlutterPlugin, MessageHandler<String> { private var channelName = "plugins.flutter.io/FlutterBasicMessageChannel" private var context: Context? = null companion object { private var basicMessageChannel: BasicMessageChannel<String>? = null fun sendContent(content: String) { basicMessageChannel?.send(content) } } override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { basicMessageChannel = BasicMessageChannel(binding.binaryMessenger, channelName, StringCodec.INSTANCE) basicMessageChannel?.setMessageHandler(this) context = binding.applicationContext } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { basicMessageChannel?.setMessageHandler(null) basicMessageChannel = null; } override fun onMessage(message: String?, reply: BasicMessageChannel.Reply<String>) { Log.i("Android", "Received message = $message") reply.reply("Reply from Android") } } import androidx.annotation.NonNull; import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant class MainActivity: FlutterActivity () { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { flutterEngine.getPlugins().add(FlutterMessagePlugin()); flutterEngine.getPlugins().add(FlutterEventPlugin()); flutterEngine.getPlugins().add(FlutterBasicMessageChannel()); GeneratedPluginRegistrant.registerWith(flutterEngine); } } 显示结果: I/flutter (19721): common_utils e result->处理完成 I/flutter (19721): common_utils e Flutter收到Android发来的消息-> Android发送消息到Flutter I/flutter (19721): common_utils e Flutter收到Android发来Basic消息->, Android发送Basic消息到Flutter

优秀的个人博客,低调大师

Flutter与Android通信方式->MethodChannel方式(发送消息并且返回结果)

摘要:Flutter版本号:1.12.13,Kotlin版本号:1.3.72 版本号不同,实现的方式不一样,所以特此标注下。 具体的实现原理,自行查阅。这里只写代码实现过程,主要原因是网上Kotlin的实现方式实在太少,特此记录。 Flutter: import 'package:base_library/base_library.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class ChannelDemoPage extends StatefulWidget { @override _ChannelDemoPageState createState() => _ChannelDemoPageState(); } class _ChannelDemoPageState extends State<ChannelDemoPage> { static const _channel = const MethodChannel('plugins.flutter.io/FlutterMessagePlugin'); @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return new Scaffold( body: new Row( ), floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, floatingActionButton: new FloatingActionButton( backgroundColor: Colors.blueAccent, onPressed: () { this.getResult(); }, child: new Icon(Icons.adb), ), ); } void getResult() async { try { Map<String, Object> map = {"shareUrl": "https://www.baidu.com"}; var result = await _channel.invokeMethod("getRealUrl", map); LogUtil.e("result->$result"); } catch (e) { LogUtil.e("e->, $e"); } } } Kotlin: import android.content.Context import android.util.Log import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.* import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result class FlutterMessagePlugin : FlutterPlugin, MethodCallHandler { private var channel: MethodChannel? = null private var context: Context? = null override fun onMethodCall(call: MethodCall, result: Result) { if (call.method == "getRealUrl") { var shareUrl = call.argument<String>("shareUrl"); Log.v("shareUrl=", shareUrl) result.success("处理完成") } else { result.notImplemented() } } companion object { var channelName = "plugins.flutter.io/FlutterMessagePlugin"; fun registerWith(registry: PluginRegistry.Registrar) { var flutterPlugin = FlutterMessagePlugin(); flutterPlugin.channel = MethodChannel(registry.messenger(), channelName); flutterPlugin.context = registry.context(); flutterPlugin.channel?.setMethodCallHandler(flutterPlugin); } } override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { channel = MethodChannel(binding.binaryMessenger, channelName) context = binding.applicationContext channel!!.setMethodCallHandler(this) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { channel?.setMethodCallHandler(null) channel = null; } } import androidx.annotation.NonNull; import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant class MainActivity: FlutterActivity () { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { flutterEngine.getPlugins().add(FlutterMessagePlugin()); GeneratedPluginRegistrant.registerWith(flutterEngine); } } 显示结果: V/shareUrl=: https://www.baidu.com I/flutter: common_utils e result->处理完成

优秀的个人博客,低调大师

YurunHttp v3.4.0 发布,支持 Http2 全双工通信

YurunHttp 是开源的 PHP HTTP 类库,支持链式操作,简单易用。 支持所有常见的 GET、POST、PUT、DELETE、UPDATE 等请求方式,支持 Http2、WebSocket、浏览器级别 Cookies 管理、上传下载、设置和读取 header、Cookie、请求参数、失败重试、限速、代理、证书等。 git 仓库中 examples 目录里是示例代码! 更新日志(v3.4.0): 新增 新增支持全双工的 Http2 客户端 新增 Attributes 属性的常量定义类,所有 Attribute 操作使用该类中的常量作为名称 Swoole Handler 引入连接管理器 新增默认缺省的默认 UserAgent (可在每个请求中指定,或设置全局Attribute::USER_AGENT用以代替默认的 UA) 支持发送 Http2 请求不调用 recv() 优化 Request对象中的Attribute缺省情况下,会从YurunHttp类中获取 重构 Swoole Handler Http2 全双工用法 该用法仅支持 Swoole $uri = new Uri('https://wiki.swoole.com/'); // 客户端初始化和连接 $client = new \Yurun\Util\YurunHttp\Http2\SwooleClient($uri->getHost(), Uri::getServerPort($uri), 'https' === $uri->getScheme()); $client->connect(); // 请求构建 $httpRequest = new HttpRequest; $request = $httpRequest->header('aaa', 'bbb')->buildRequest($uri, [ 'date' => $i, ], 'POST', 'json'); for($i = 0; $i < 10; ++$i) { go(function() use($client, $request){ // 发送(支持在多个协程执行) $streamId = $client->send($request); var_dump('send:' . $streamId); // 接收(支持在多个协程执行) $response = $client->recv($streamId, 3); $content = $response->body(); var_dump($response); }); } 具体用法请看examples/http2Client.php 重大版本更新日志 每个小版本的更新日志请移步到 Release 查看 v3.4.0 新增支持Http2全双工用法 v3.3.0 新增支持Http2兼容用法 v3.2.0 新增支持Swoole WebSocket客户端 v3.1.0 引入浏览器级别Cookies管理 v3.0.0 新增支持Swoole协程 v2.0.0 黑历史,不告诉你 v1.3.1 支持Composer v1.0-1.3 初期版本迭代 Composer 本项目可以使用composer安装,遵循psr-4自动加载规则,在你的composer.json中加入下面的内容 { "require": { "yurunsoft/yurun-http": "^3.4.0" } } 然后执行composer update安装。 之后你便可以使用include "vendor/autoload.php";来自动加载类。(ps:不要忘了namespace) 用法 简单调用 <?php use Yurun\Util\HttpRequest; $http = new HttpRequest; $response = $http->ua('YurunHttp') ->get('http://www.baidu.com'); echo 'html:', PHP_EOL, $response->body(); PSR-7 请求构建 <?php use Yurun\Util\YurunHttp\Http\Request; use Yurun\Util\YurunHttp; $url = 'http://www.baidu.com'; // 构造方法定义:__construct($uri = null, array $headers = [], $body = '', $method = RequestMethod::GET, $version = '1.1', array $server = [], array $cookies = [], array $files = []) $request = new Request($url); // 发送请求并获取结果 $response = YurunHttp::send($request); var_dump($response); Swoole 协程模式 <?php use Yurun\Util\YurunHttp; use Yurun\Util\HttpRequest; // 设置默认请求处理器为 Swoole YurunHttp::setDefaultHandler('Yurun\Util\YurunHttp\Handler\Swoole'); // php 5.4 // YurunHttp::setDefaultHandler(\Yurun\Util\YurunHttp\Handler\Swoole::class); // php 5.5+ // Swoole 处理器必须在协程中调用 go('test'); function test() { $http = new HttpRequest; $response = $http->get('http://www.baidu.com'); echo 'html:', PHP_EOL, $response->body(); } WebSocket Client YurunHttp::setDefaultHandler(\Yurun\Util\YurunHttp\Handler\Swoole::class); go(function(){ $url = 'ws://127.0.0.1:1234/'; $http = new HttpRequest; $client = $http->websocket($url); if(!$client->isConnected()) { throw new \RuntimeException('Connect failed'); } $client->send('data'); $recv = $client->recv(); var_dump('recv:', $recv); $client->close(); }); 具体详见examples目录中的示例代码 相关地址: API 文档:https://apidoc.gitee.com/yurunsoft/YurunHttp Gitee:https://gitee.com/yurunsoft/YurunHttp Github:https://github.com/Yurunsoft/YurunHttp

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册