WPF + laravel + workerman整合网络通信

WPF + laravel + workerman整合网络通信

  • 最近更新2018年07月12日

首先,要说的是,我是一个新手,新学的C#、新学的WPF、新学的laravel、新学的workerman,所有的都是新学的,不过我花了一个多月的时间,解决了很多技术点,这些做的可以是比较偏门的内容,也可能是很多人需要的技术点,所以今天整理出来,大神请飘过。

其次,说一下我要做的内容吧,框架模型如下。

我要做的是客户端与服务器端进行通信,客户端会有数据与服务器进行交互,由于现在WebSocket比较流行,所以我也采用的此技术。而服务器端使用了较为流行的PHP框架Laravel,接下来分别对每一端进行简单介绍。

客户端:使用的是WPF(当然使用C#也可以),为了节省开发量,所以借用了开源的内容websocket-cshap,用此来实现WebSocket客户端,对服务器进行网络通信。

服务器端:开发语言是PHP,使用了框架Laravel,由于框架本身对于网络通信是弱项,所以选择了开源项目Workerman来实现数据交互。

在服务器端,除了网络通信外,还需要进行数据库操作,而数据库操作使用的是Laravel的数据库操作方法。到此所有设计的模式介绍完成,接下来,把实现方法进行描述一下。

一、客户端的实现

创建WPF的工程方法,这里就不再说明了,主界面如下图所示。

接下来,大家可以去GitHub去下载C#的WebSocket开源项目,下载地址为:https://github.com/sta/websocket-sharp,将项目中的“websocket-sharp.dll”加入到你所创建的WPF项目,“解决方案资源管理器”->“你项目名称”->“引用”点击鼠标右键,选择“添加引用”,点击“浏览”按钮选择dll所在位置,并选择后,点击“确定”按钮,确认加入。

在你的项目空间中,映射按钮的方法,要不忘记了,在你的代码中,要加入引入刚刚加入的库“using WebSocketSharp;”,如图第15行。

对“连接”、“发送”以及“关闭”按钮加入相应的代码,代码内容如下图所示,大家自己读一下吧。其中“m_webSocket = new WebSocket(“ws://192.168.0.102:8080”);”,描述了所使用的协议是WebSocket,服务器的IP地址为“192.168.0.102”,所开放的端口是“8080”。

在代码中,特别需要说明的是,客户端发送数据使用的是“Send”方法,位于第40行,这里所发送的数据,服务器端可以接收,可以使用发送的内容来确认我们要操作的内容。所以在这里,实现了客户端向服务器端发送数据。

在“连接”按钮中,还有一个方法“m_webSocket.OnMessage += M_webSocket_OnMessage;”它真正实现的方法在第48行至54行,在“M_webSocket_OnMessage”方法中,实现了服务器端数据的接收,当需要服务器返回数据时,可以在这里接收。数据存放在“e.Data”中。

24行,定义了WebSocket的对象。

31-38行(连接按钮实现方法),实现了服务器的初始化操作,并进行了连接。

40-46行(发送按钮实现方法),实现了向服务器发送数据。

48-53行(接收服务器数据方法),实现了接收服务器发送过来的数据。

55-59行(关闭按钮实现方法),实现了断开服务器连接。

二、服务器端的实现

首先,先下载Laravel框架、Workerman,个人建议使用composer来进行管理。如果你成功的安装了PHP,就可以在线安装,你也可以通过百度,去查一下composer如何安装与配置,其实,直接输入如下代码即可。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

接下来通过composer来安装Laravel安装器,使用安装器安装器,会安装最新版本的Laravel,我的示例中使用Laravel5.4,所以不需要使用安装器,如果你需要,输入如下代码即可(如果不需要,可以自行下载需要的版本)。

composer global require "laravel/installer"

 

composer安装workerman,需要进入到你所下载的Laravel的安装目录下,执行如下代码进行安装(你也可以自行下载),安装后目录会在“Laravel目录/vendor”下。

composer require workerman/workerman

 

如果想使用Workerman,就需要使用Command命令,创建方法如下。

php artisan make:command WorkermanHttpserver

 

执行完成后,进入App\Console\Commands目录下

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Workerman\Worker;
use App;

class WorkermanHttpServer extends Command
{
    protected $httpserver;
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'workerman:httpserver {action} {--daemonize}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'workerman httpserver';


    public function fire() {

        echo "fire.......\n";
    }


    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // 实例1:HTTP协议,可对外提供Web服务.

        //因为workerman需要带参数 所以得强制修改
        global $argv;
        $action = $this->argument('action');
        if (!in_array($action, ['start', 'stop'])) {
            $this->error('Error Arguments');
            exit;
        }
        $argv[0] = 'workerman:httpserver';
        $argv[1] = $action;
        $argv[2] = $this->option('daemonize') ? '-d' : '';

        //$this->httpserver=new Worker('http://0.0.0.0:8080');
        $this->httpserver = new Worker('websocket://0.0.0.0:8080');

        // 当客户端连接上发来数据时调用
        $this->httpserver->onMessage = function ($connection, $data) {
            //$connection->send('laravel workerman hello world');
            //var_dump($data);
            //print_r($data);
            echo "Rev:" . $data . "\n";
            if ($data == "insert") {

                // 新增加数据
                DB::table('student')->insert(
                    [
                        'name' => 'dd1',
                        'age' => 18,
                        'sex' => 1,
                        'create_at' => 1234567890,
                        'updated_at' => 1234567890
                    ]
                );

                echo "insert ok.\n";
            }//end if

            $connection->send('receive success');
        };

        // 当客户端连接断开时触发
        $this->httpserver->onClose = function ($connection) {
            echo "connection closed \n";
        };

        Worker::runAll();

    }
}

 

分享到 :
相关推荐

发表回复

登录... 后才能评论