概述

上一篇简单的认识了Socket以及他的使用,在学习过程中看到了WebSocket的身影,于是乎百度了一把,这货也可以做全双工的网络通讯,而且是html5提出来的新东西!程序员嘛!就是要对新的东西充满了好奇!

WebSocket

引用API里面的一句话,WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

全双工:简单理解为C,S端可以相互发送和接收数据。

WebSocket和Socket之间有啥关系?

答:李鬼和李逵的关系,他只是名字上带有Socket,他是同Http一样使用TCP协议来传输数据的,但是和Http最大的不同就是他是全双工的。 
还不明白的话看下面的解释。


WebSocket 协议本质上是一个基于 TCP 的协议。 
为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。 

他首先是在Html5中被提出来的,使用javaScript与服务端建立全双工通道。但是这套思想也有人做出了jar包提供给java使用。

我们先来看下在Html中他是如何使用的。

在Html中的使用

要注意有些浏览器现在还不支持WebSocket,我们先用Chrom测试。

占坑

在Android中的使用(Android 聊天室)

先看下效果吧,下面代码太多了,不过很简单,就不放源码下载地址了。

思路就是,一个服务端转发消息,多个移动端接收消息。

Android端代码

1 引入java-WebSocket依赖包

在module/build.gradle 中

  1. //WebSocket 依赖包
  2. compile 'org.java-websocket:Java-WebSocket:1.3.0'

别忘了在AndroidManifest.xml 中加上网络权限

  1. <uses-permission android:name="android.permission.INTERNET" />

2 逻辑代码

  1. public class WebSocketActivity extends AppCompatActivity {
  2. @Bind(R.id.m_content_et)
  3. EditText mContentEt;
  4. @Bind(R.id.m_sent_bt)
  5. Button mSentBt;
  6. @Bind(R.id.m_content_tv)
  7. TextView mContentTv;
  8. private WebSocketClient mSocketClient;
  9. private Handler handler = new Handler() {
  10. @Override
  11. public void handleMessage(Message msg) {
  12. super.handleMessage(msg);
  13. mContentTv.setText(mContentTv.getText() + "\n" + msg.obj);
  14. }
  15. };
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_web_socket);
  20. ButterKnife.bind(this);
  21. init();
  22. }
  23. private void init() {
  24. new Thread(new Runnable() {
  25. @Override
  26. public void run() {
  27. try {
  28. //TODO 这里URL 别忘了切换到自己的IP
  29. mSocketClient = new WebSocketClient(new URI("ws://10.27.0.197:2017/"), new Draft_10()) {
  30. @Override
  31. public void onOpen(ServerHandshake handshakedata) {
  32. Log.d("picher_log", "打开通道" + handshakedata.getHttpStatus());
  33. handler.obtainMessage(0, message).sendToTarget();
  34. }
  35. @Override
  36. public void onMessage(String message) {
  37. Log.d("picher_log", "接收消息" + message);
  38. handler.obtainMessage(0, message).sendToTarget();
  39. }
  40. @Override
  41. public void onClose(int code, String reason, boolean remote) {
  42. Log.d("picher_log", "通道关闭");
  43. handler.obtainMessage(0, message).sendToTarget();
  44. }
  45. @Override
  46. public void onError(Exception ex) {
  47. Log.d("picher_log", "链接错误");
  48. }
  49. };
  50. mSocketClient.connect();
  51. } catch (URISyntaxException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }).start();
  56. mSentBt.setOnClickListener(new View.OnClickListener() {
  57. @Override
  58. public void onClick(View v) {
  59. if (mSocketClient != null) {
  60. mSocketClient.send(mContentEt.getText().toString().trim());
  61. }
  62. }
  63. });
  64. }
  65. @Override
  66. protected void onDestroy() {
  67. super.onDestroy();
  68. if (mSocketClient != null) {
  69. mSocketClient.close();
  70. }
  71. }
  72. }

这就好了,很简单,接下来看下服务端的代码写法

服务端代码

1 引入jar包

去下载jar,获取自己配maven 
https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket/1.3.0

2 编写WebSocketServer

  1. public class MWebSocketService extends WebSocketServer {
  2. public MWebSocketService(int port) throws UnknownHostException {
  3. super(new InetSocketAddress(port));
  4. }
  5. public MWebSocketService(InetSocketAddress address) {
  6. super(address);
  7. }
  8. @Override
  9. public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
  10. String address = webSocket.getRemoteSocketAddress().getAddress().getHostAddress();
  11. String message = String.format("(%s) <进入房间!>", address);
  12. sendToAll(message);
  13. System.out.println(message);
  14. }
  15. @Override
  16. public void onClose(WebSocket webSocket, int i, String s, boolean b) {
  17. String address = webSocket.getRemoteSocketAddress().getAddress().getHostAddress();
  18. String message = String.format("(%s) <退出房间!>", address);
  19. sendToAll(message);
  20. System.out.println(message);
  21. }
  22. @Override
  23. public void onMessage(WebSocket webSocket, String s) {
  24. //服务端接收到消息
  25. String address = webSocket.getRemoteSocketAddress().getAddress().getHostAddress();
  26. String message = String.format("(%s) %s", address, s);
  27. //将消息发送给所有客户端
  28. sendToAll(message);
  29. System.out.println(message);
  30. }
  31. private static void print(String msg) {
  32. System.out.println(String.format("[%d] %s", System.currentTimeMillis(), msg));
  33. }
  34. @Override
  35. public void onError(WebSocket webSocket, Exception e) {
  36. if (null != webSocket) {
  37. webSocket.close(0);
  38. }
  39. e.printStackTrace();
  40. }
  41. public void sendToAll(String message) {
  42. // 获取所有连接的客户端
  43. Collection<WebSocket> connections = connections();
  44. //将消息发送给每一个客户端
  45. for (WebSocket client : connections) {
  46. client.send(message);
  47. }
  48. }
  49. }

3 编写main方法

  1. public class WebSocketMainMethod {
  2. private static int PORT = 2017;
  3. public static void main(String[] args) throws IOException {
  4. MWebSocketService socketServer = new MWebSocketService(PORT);
  5. socketServer.start();
  6. try {
  7. String ip = InetAddress.getLocalHost().getHostAddress();
  8. int port = socketServer.getPort();
  9. System.out.println(String.format("服务已启动: %s:%d", ip, port));
  10. } catch (UnknownHostException e) {
  11. e.printStackTrace();
  12. }
  13. InputStreamReader in = new InputStreamReader(System.in);
  14. BufferedReader reader = new BufferedReader(in);
  15. while (true) {
  16. try {
  17. String msg = reader.readLine();
  18. socketServer.sendToAll(msg);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24. }

OK,看下成果图!

其他

在学习的过程中也发现了不少别人封装好的库,也记录进来吧

以下内容转自 android中使用webSocket通信

1.AndroidAsyn

GitHub地址:https://github.com/koush/AndroidAsync

  1. dependencies {
  2. compile 'com.koushikdutta.async:androidasync:2.+'
  3. }

2.autobahn 
官网:http://autobahn.ws/android/,下到jar包放项目里面就好了

使用起来同样很简单。

  1. private WebSocketConnection mConnect = new WebSocketConnection();
  2. //这里不要忘了要切到自己服务器的IP去
  3. String url = "ws://192.168.250.38:8181/";
  4. public void init() {
  5. try {
  6. mConnect.connect(url, new WebSocketHandler() {
  7. @Override
  8. public void onOpen() {
  9. Log.i(TAG, "onOpen: ");
  10. }
  11. @Override
  12. public void onTextMessage(String payload) {
  13. Log.i(TAG, "onTextMessage: "+payload);
  14. }
  15. @Override
  16. public void onClose(int code, String reason) {
  17. Log.i(TAG, "onClose: " + code + "|" + reason);
  18. }
  19. });
  20. } catch (WebSocketException e) {
  21. e.printStackTrace();
  22. }
  23. }

Android通讯-webSocket的更多相关文章

  1. Android通讯:短信

    Android通讯之短信功能实现: 使用android.telephony.SmsManager对象,可以发送短信和彩信.// 构造回调函数,短信发送结束后,会发出对应的Intent请求Intent ...

  2. Android通讯:通话

    Android通讯之通话功能的实现: 在Android中,android.telephony.TelephonyManager对象是开发者获取当前通话网络相关信息的窗口,通过TelephonyMana ...

  3. H5即时通讯Websocket

    /** * Created by admin on 2017/8/19. */ // import Vue from 'vue' // import axios from './HTTP.js' // ...

  4. Java Netty和Android之WebSocket,Springboot和Vue项目网址

    在Netty上使用Websocket和网页上写个简单的websocket https://www.cnblogs.com/amibandoufu/p/11442881.html Android上使用w ...

  5. android 通讯类资料整理

    https://github.com/koush/AndroidAsync(websocket) https://github.com/loopj/android-async-http http:// ...

  6. Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)

    通过adb和Android通讯需要引用adb相关的组件到项目中,分别为:adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll. 可以在XXX\sdk\platform-tool ...

  7. 一、cocos2d-x 3.0 final使用httpclient编译到android,须要用到的android.mk

    今天写一个网络框架,在vs上面非常欢快的执行车,心想,尼玛!cocos2d-x 3.0这么方便,预计不久的将来我就能回家种地了,由于不用程序猿了,直接cocos2dstudio拖界面了= =!!. 写 ...

  8. WebSocket数据包协议详解

    其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分. ...

  9. vue+websocket+express+mongodb实战项目(实时聊天)

    继上一个项目用vuejs仿网易云音乐(实现听歌以及搜索功能)后,发现上一个项目单纯用vue的model管理十分混乱,然后我去看了看vuex,打算做一个项目练练手,又不想做一个重复的项目,这次我就放弃颜 ...

随机推荐

  1. 如何远程调试部署在CloudFoundry平台上的nodejs应用

    网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等. 在实际情况中,我们可能遇到本地运行良好 ...

  2. c中fgets与strlen

    fgets函数从文件读取'\n'并存储,在'\n'后再增加一个'\0'构成字符串. 但fgets函数需要指定读入的字符数,如果指定了n,则最多只能读取n-1个.fgets在读取了n-1个字符.读到了' ...

  3. C# Winfrom TabControl美化

    实例一: using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; na ...

  4. 关于rtos中任务切换时的程序流程

    今天和一个小伙伴讨论了一下基于cortex-m3内核的RTOS在任务切换时的程序流程,小伙伴说国内某搜索引擎都搜不到这类的信息,所以我才打算写下来,硬件平台是stm32f1​. 这里的切换有两种情况: ...

  5. PAT Basic 1072 开学寄语 (20 分)

      下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智. ...

  6. TF_Variable Sharing

    Reference: http://jermmy.xyz/2017/08/25/2017-8-25-learn-tensorflow-shared-variables/ Tensorflow does ...

  7. Xadmin相关实现

    一,保存搜索条件(Save search conditions) kept conditions(保存条件)的应用场景比较常见,在我们查询时,可以实现多条件的筛选查询,比如:在淘宝上,选择了其中的一个 ...

  8. okhttp拦截器之CacheInterceptor解析

    在上一次[https://www.cnblogs.com/webor2006/p/9150658.html]了解了缓存的存与取的细节之后,接下来就可以分析一下OkHttp的缓存拦截器啦: OkHttp ...

  9. PHP 提取数组中奇数或偶数的元素array_filter

    //提取奇数 $filter = array_filter($ql,function($var){ return($var & 1); },ARRAY_FILTER_USE_KEY); pri ...

  10. Linux如何判断自己的服务器是否被入侵

    如何判断自己的服务器是否被入侵了呢?仅仅靠两只手是不够的,但两只手也能起到一些作用,我们先来看看UNIX系统上一些入侵检测方法,以LINUX和solaris为例. 1.检查系统密码文件 首先从明显的入 ...