©版权声明:本文为原创文章,未经允许不得转载,如需转载请注明版权

最近抽空处理一些技术上的问题,App和PC 端需要通过服务器push data,之前有接触到NodeJs 和web端的开发任务,所以也顺理成章进坑,由于接触的东西比较片面,也没深入研究,只是单纯完成demo的实现,如有疑问,也可以一起学习一下。

在动手前,已经有相关nodejs socket-io 经验,由于同事没办法实现其他终端连接上push server 只能另行挖坑,google 百度 最后查看了几篇文章,大致收获信息都差不多,学习过程中整理了一下,以后再进坑也轻车熟路。

此处有坑:

Web Android iOS OkHttp3 Nodejs WebSocket SocketIO Starscream

android 用的是 Kotlin 语言

iOS 用的是Swift 语言

不扯了,上代码。

Android 端连接 nodejs websocket

class WebSocketClient{

private val WS_IP_PORT = "192.168.5.101:8181"

private var client: OkHttpClient? = null

private var webSocket: WebSocket? = null

@Synchronized fun startRequest() {

if (null == client) {

client = OkHttpClient()

}

if (null == webSocket) {

val request = Request.Builder().url("ws://" + WS_IP_PORT + "/ws")

.addHeader("Origin", "http://" + WS_IP_PORT)

.build()

webSocket = client!!.newWebSocket(request, EchoWebSocketListener())

}

}

private fun sendMessage(webSocket: WebSocket?) {

webSocket!!.send("Hello!")

webSocket!!.send(ByteString.decodeHex("Hello!"))

}

fun closeWebSocket(){

if (null != webSocket) {

webSocket!!.close(NORMAL_CLOSURE_STATUS, "Goodbye!")

webSocket = null

}

}

fun destroy(){

if (null != client) {

client!!.dispatcher().executorService().shutdown()

client = null

}

}

fun resetWebSocket(){

synchronized(WebSocketClient::class.java) {

webSocket = null

}

}

inner class EchoWebSocketListener : WebSocketListener() {

override fun onOpen(webSocket: WebSocket?, response: Response?) {

super.onOpen(webSocket, response)

L.d("------------------------------------ onOpen")

sendMessage(webSocket!!)

}

override fun onClosed(webSocket: WebSocket?, code: Int, reason: String?) {

super.onClosed(webSocket, code, reason)

L.d("------------------------------------ onClosed")

}

override fun onClosing(webSocket: WebSocket?, code: Int, reason: String?) {

super.onClosing(webSocket, code, reason)

L.d("------------------------------------ onClosing")

}

override fun onFailure(webSocket: WebSocket?, t: Throwable?, response: Response?) {

super.onFailure(webSocket, t, response)

L.d("------------------------------------ onFailure ", t!!.message)

}

override fun onMessage(webSocket: WebSocket?, bytes: ByteString?) {

super.onMessage(webSocket, bytes)

L.d("------------------------------------ onMessage", bytes!!.toString())

}

override fun onMessage(webSocket: WebSocket?, text: String?) {

super.onMessage(webSocket, text)

L.d("------------------------------------ onMessage" + text!!)

}

}

}

var WebSocketServer = require('ws').Server,

wss = new WebSocketServer({ port: 8181 });

wss.on('connection', function (ws) {

console.log('client connect...');

//监听消息发送事件

ws.on('message', function (message) {

console.log("getMessage" + message);

});

//客户端关闭

ws.on('close', function () {

console.log('client disconnect...');

});

});

var Server = require('socket.io');

var _ = require("lodash");

var arrClient = [];

var io = null;

exports.init = function(server, isDebug){

io = new Server().listen(server);

//设置可以传输数据类型

io.set('transports', [

'websocket',

'flashsocket',

'htmlfile',

'polling'

]);

io.on('connection', function (socket) {

var client = {

socket : socket,

socketId: socket.id

};

//进入链接

socket.on('login', function(objUser){

console.log('user : ' + objUser.name + ' login ...');

client.user = objUser;

client.userId = objUser.id;

arrClient.push(client);

});

//监听退出事件

socket.on('disconnect', function () {

//去除掉线对象

_.remove(arrClient, function(obj) {

return obj.socketId === socket.id;

});

if(client.user){

console.log('user : 1' + client.user.name + ' disconnect ...');

}else{

console.log('user : 2 undefined disconnect ...');

}

});

});

};

node shell

npm install

node app.js

or

node app.js debug

debug http://ip:port/index.html

or

http://ip:port/index2.html

data server --> http --> pushData --> node WebSocketServer --> websocket --> client

public static String post(String request, List params) {

String html = "";

try {

CloseableHttpClient httpclient = HttpClients.createDefault();

HttpPost httppost = new HttpPost(request);

UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, "UTF-8");

httppost.setEntity(formEntity);

HttpResponse response = httpclient.execute(httppost);

HttpEntity entity = response.getEntity();

html = EntityUtils.toString(entity);

httpclient.close();

} catch (Exception e) {

e.printStackTrace();

} finally {

}

return html;

}

public static void main(String[] args) {

int i = 0;

for (;;) {

i++;

String value = " Hello! " + i;

JSONObject data = new JSONObject();

data.put("data", value);

BasicNameValuePair basicNameValuePair = new BasicNameValuePair("data", data.toJSONString());

List values = new ArrayList(0);

values.add(basicNameValuePair);

state = post("http://192.168.5.101:8888/pushData", values);

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

class SocketIOClient {

private var socket: Socket? = null

fun connect() {//连接

socket = IO.socket("http://192.168.5.100:3000/");

socket!!.on(Socket.EVENT_CONNECT, object : Emitter.Listener {

override fun call(vararg p0: Any?) {

L.d("---------------------------------EVENT_CONNECT")

}

}).on(Socket.EVENT_ERROR, object : Emitter.Listener {

override fun call(vararg p0: Any?) {

L.d("---------------------------------EVENT_ERROR")

}

}).on(Socket.EVENT_RECONNECT_FAILED, object : Emitter.Listener {

override fun call(vararg p0: Any?) {

L.d("---------------------------------EVENT_RECONNECT_FAILED")

}

})

socket!!.connect()

}

}

//log

compile 'com.safframework.log:saf-log:1.0.5'

compile ('io.socket:socket.io-client:0.8.3') {

// excluding org.json which is provided by Android

exclude group: 'org.json', module: 'json'

}

Web Client

var socket = io.connect('192.168.5.100:3000');

var receiveContent = $('#receiveContent');

//收到server的连接确认

//收到server的连接确认

socket.on('connect',function(){

$('#status').html('链接成功.......');

isConnected = true;

socket.emit('login', {

id: '0',

name: 'void'

});

console && console.log('connected is ok');

});

socket.on('message',function(param){

console.log(param);

receiveContent.html(param.message);

});

var websocket = null;

//判断当前浏览器是否支持WebSocket

if('WebSocket' in window){

websocket = new WebSocket("ws://192.168.5.101:8181/ws");

}

else{

alert('Not support websocket')

}

//连接发生错误的回调方法

websocket.onerror = function(){

setMessageInnerHTML("error");

};

//连接成功建立的回调方法

websocket.onopen = function(event){

setMessageInnerHTML("open");

}

//接收到消息的回调方法

websocket.onmessage = function(event){

setMessageInnerHTML(event.data);

}

//连接关闭的回调方法

websocket.onclose = function(){

setMessageInnerHTML("close");

}

//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。

window.onbeforeunload = function(){

websocket.close();

}

//将消息显示在网页上

function setMessageInnerHTML(innerHTML){

document.getElementById('message').innerHTML += innerHTML + '';

}

//关闭连接

function closeWebSocket(){

websocket.close();

}

//发送消息

function send(){

var message = document.getElementById('text').value;

websocket.send(message);

}

pod install

import Starscream

class ViewController: UIViewController, WebSocketDelegate {

var socket: WebSocket = WebSocket(url: URL(string: "ws://192.168.5.100:8181/ws")!)

override func viewDidLoad() {

super.viewDidLoad()

// Do any additional setup after loading the view, typically from a nib.

connect()

}

func connect(){

socket.delegate = self

socket.connect()

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

func websocketDidConnect(_ socket: WebSocket) {

print("------------------->> websocketDidConnect")

sendMessage()

}

func sendMessage(){

socket.write(string: "Hello World! ")

}

func websocketDidDisconnect(_ socket: WebSocket, error: NSError?) {

print("------------------->> websocketDidDisconnect")

}

func websocketDidReceiveData(_ socket: WebSocket, data: Data) {

print("------------------->> websocketDidReceiveData")

}

func websocketDidReceiveMessage(_ socket: WebSocket, text: String) {

print("------------------->> websocketDidReceiveMessage")

}

}

平时没记录的习惯,简书代码格式我快崩溃了 有点丑 不说了,敲坏了几个键盘。

虽然传达的信息有限,但还是得动手干了才知道,不要怂,就要干。

如果对你有帮助的话 给个 Star 吧

nodejs android ios,NodeJs 搭建WebSocket Push Server Web Android iOS Client相关推荐

  1. Android开发环境搭建全程演示(jdk+eclipse+android sdk)

    全程演示android开发环境的搭建过程,无需配置环境变量.所有软件都是写该文章时最新版本 一 相关下载 (1) java JDK下载: 进入该网页: http://java.sun.com/java ...

  2. win7 android 编译环境搭建,在Win7下配置Android开发环境

    在Win7下配置Android开发环境是本文要介绍的内容,主要是来了解并学习Android开发环境,具体关于Android开发环境的详解来看本文. 一.安装 JDK 下载JDK最新版本,下载地址如下: ...

  3. 手把手教你搭建自己的Java Web(Android)项目(SpringMVC + Mybatis服务端,Html5 Web端, Android客户端实现)

    刚工作不久的时候,学到了几点内容:软件产品挣的是大家的钱:内容整合是一个比较好的产品形态:可以通过广告的方式挣钱.但是就怀着这个想法,从去年12月份开始,一直想着自己搞点东西出来,即使最终没有人使用, ...

  4. 简易漫画网站搭建-漫画喵Server版

    小喵的唠叨话:寒假的时候写了一个漫画爬虫,爬取了好几个漫画,不过一直没有找到合适的漫画阅读的工具.因此最近就试着自己写一个漫画的网站,放在公网上或者局域网里,这样就能随时随地用手机.Pad看漫画了. ...

  5. Visual Studio 2013 Xamarin for iOS 环境搭建

    原文:Visual Studio 2013 Xamarin for iOS 环境搭建 一.Mac安装Xamarin.iOS 1,我的Mac 环境:OSX 10.10.3.Xcode 6.3.2 (使用 ...

  6. 【ROS】Android开发环境搭建

    目录 ROS Android开发环境搭建 1.安装ROSJAVA 2.Android Core安装 3.Creating Android Packages 4.Android Studio 创建ROS ...

  7. Android开发环境搭建与入门Hello World

    一直没机会接触手机开发,很想开发一款手机围棋软件,今天先学习一下环境搭建与Hello World吧. 环境配置对于没入门的很麻烦,谁如果有需要留下QQ邮箱,我发给你.不客气,呵呵. 推荐一本书: Go ...

  8. win7下android开发环境搭建(win7 64位)

    注意:此为win7 (64)位系统 那么win7下32位系统如何进行android开发环境搭建呢?>>>win7下android开发环境搭建(win7 32位) 一.安装 JDK 下 ...

  9. Android Studio下载搭建学习笔记01

    Android Studio下载搭建学习笔记01 下载Android Studio 安装Android Studio 进入安装向导 选择安装组件 选择安装位置 选择文件菜单 等待安装 启动并配置And ...

  10. websocket 学习--简单使用,nodejs搭建websocket服务器,到模拟股票,到实现聊天室

    websocket简介: WebSocket协议是 HTML5 开始提供的一种基于TCP的一种新的全双工通讯的网络通讯协议.它允许服务器主动发送信息给客户端. 和http协议的不同?? HTTP 协议 ...

最新文章

  1. EOSIO 转帐详解
  2. Html5 FileReader 对文件进行Base64编码
  3. KDDockWidgets源码编译及安装
  4. Android Wear 唤醒热词会比“你好,安卓”好吗?
  5. php 重载等号,重载运算符
  6. 基于Accord.Audio和百度语言识别
  7. react构建_您应该了解的有关React的一切:开始构建所需的基础知识
  8. 操作word打印网址
  9. 《解读NoSQL》——1.4 小结
  10. freertos 编译c++失败_FreeRTOS的初次见面
  11. 规划极限编程阅读笔记01
  12. kubernetes 客户端client-go 使用及常用api
  13. 在64位操作系统上使用FlashDevelop的Debug功能
  14. dnf韩服服务器维护中,DNF韩服官方居然自己在服务器上开了个“私服”深渊必掉史诗...
  15. D5渲染器 视频学习笔记
  16. matlab自己还原魔方,复原魔方,原来这么简单(内附详细图文解说)
  17. ADPCM 音频压缩算法
  18. Lesson 20 One man in a boat 独坐孤舟
  19. 电脑使用DP线连接显示器,插在显示器音频口的音响没有声音解决办法
  20. IEEE754 浮点数的表示方法

热门文章

  1. uniapp 自定义头部 支持微信、百度、头条小程序
  2. 【JZOJ5882】雪人
  3. 计算机与网络如何连接网络设置,电脑网络连接网络配置方法
  4. 软件测试周刊(第54期):管他乐观还是悲观,都滚蛋,干就完了。
  5. Pyke 逻辑编程入门(2):表示事实的陈述句
  6. ASP常用服务器获取各类信息汇总
  7. 如何看待数字化转型对制造业的影响?
  8. 地震速度分析matlab程序,地震波频谱分析。。。。。
  9. 中层领导力:西点军校和哈佛大学共同讲授的领导力教程读书摘要
  10. 整理一下用得着的链接