WebSocket简介

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。全双工就是指客户端和服务端可以同时进行双向通信,强调同时、双向通信。

我个人对WebSocket的印象还停留在上大学的时候,出来工作之后一直没用到过,这次项目中需求是Android搭建WebSocket服务端,所以才不得不重新去学习了解一下WebSocket,查了很多资料,基本上移动端做WebSocket都是作为客户端的应用场景,很少有作为服务端的,然后我试着去看了下Java后端搭建WebSocket服务端的方法,最后搭建出一个Android WebSocket服务端,下面把代码贴出来,我对WebSocket并不是特别精通,有很多不足之处,希望大家指正出来。

compile "org.java-websocket:Java-WebSocket:1.3.6"

 

ServerSocket类

import android.util.Log;import org.java_websocket.WebSocket;import org.java_websocket.handshake.ClientHandshake;import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;import java.net.UnknownHostException;/** * Created by Roc on 2018/10/9. */public class ServerSocket extends WebSocketServer {    private ServerManager _serverManager;    public ServerSocket(ServerManager serverManager,int port) throws UnknownHostException {        super(new InetSocketAddress(port));        _serverManager=serverManager;    }    @Override    public void onOpen(WebSocket conn, ClientHandshake handshake) {        Log.i("TAG","Some one Connected...");    }    @Override    public void onClose(WebSocket conn, int code, String reason, boolean remote) {        _serverManager.UserLeave(conn);    }    @Override    public void onMessage(WebSocket conn, String message) {        Log.i("TAG","OnMessage:"+message.toString());        if (message.equals("1")) {            _serverManager.SendMessageToUser(conn, "What?");        }        String[] result=message.split(":");        if (result.length==2) {            if (result[0].equals("user")) {                _serverManager.UserLogin(result[1], conn);            }        }    }    @Override    public void onError(WebSocket conn, Exception ex) {        Log.i("TAG","Socket Exception:"+ex.toString());    }    @Override    public void onStart() {    }}
ServerManager类
import android.util.Log;import org.java_websocket.WebSocket;import org.java_websocket.WebSocketImpl;import java.util.HashMap;import java.util.Map;import java.util.Set;/** * Created by Roc on 2018/10/9. */public class ServerManager {    private ServerSocket serverSocket=null;    private Map userMap=new HashMap();    public ServerManager(){    }    public void UserLogin(String userName,WebSocket socket){        if (userName!=null||socket!=null) {            userMap.put(socket, userName);            Log.i("TAG","LOGIN:"+userName);            SendMessageToAll(userName+"...Login...");        }    }    public void UserLeave(WebSocket socket){        if (userMap.containsKey(socket)) {            String userName=userMap.get(socket);            Log.i("TAG","Leave:"+userName);            userMap.remove(socket);            SendMessageToAll(userName+"...Leave...");        }    }    public void SendMessageToUser(WebSocket socket,String message){        if (socket!=null) {            socket.send(message);        }    }    public void SendMessageToUser(String userName,String message){        Set ketSet=userMap.keySet();        for(WebSocket socket : ketSet){            String name=userMap.get(socket);            if (name!=null) {                if (name.equals(userName)) {                    socket.send(message);                    break;                }            }        }    }    public void SendMessageToAll(String message){        Set ketSet=userMap.keySet();        for(WebSocket socket : ketSet){            String name=userMap.get(socket);            if (name!=null) {                socket.send(message);            }        }    }    public boolean Start(int port){        if (port<0) {            Log.i("TAG","Port error...");            return false;        }        Log.i("TAG","Start ServerSocket...");        WebSocketImpl.DEBUG=false;        try {            serverSocket=new ServerSocket(this,port);            serverSocket.start();            Log.i("TAG","Start ServerSocket Success...");            return true;        } catch (Exception e) {            Log.i("TAG","Start Failed...");            e.printStackTrace();            return false;        }    }    public boolean Stop(){        try {            serverSocket.stop();            Log.i("TAG","Stop ServerSocket Success...");            return true;        } catch (Exception e) {            Log.i("TAG","Stop ServerSocket Failed...");            e.printStackTrace();            return false;        }    }}

使用的时候只需要用ServerManager对象调用start和stop方法,调用start方法需要设置一个端口号。搭建好了之后可以写一个客户端测试一下,下面是我测试截图,我使用的是在线测试工具进行测试(http://www.blue-zero.com/websocket/)

 

 

 

 

 

 

更多相关文章

  1. listView下拉刷新(仿sina微博Android客户端效果)
  2. Android前台画面和后台service之间通信的方法之Broadcast
  3. Android开发之Tools使用
  4. PC_android通信之传输图片并显示在手机端
  5. Android(安卓)客户端与服务器交互方式
  6. android开源
  7. android IPC机制讲解(一)
  8. Android(安卓)内核--Binder架构分析
  9. java与VC通信-socket

随机推荐

  1. Android(安卓)DatePicker setMaxDate和se
  2. android adb 读写模式 挂载文件系统
  3. Android(安卓)ImageView的scaleType & se
  4. Android(安卓)Studio报错 (androidx.recy
  5. android_常用UI控件_02_EditText_01添加
  6. 『ANDROID』Android实现圆形的图片边角
  7. android 浮窗
  8. android NDK 开发
  9. android读取SDCard任意路径下的文件
  10. Android(安卓)读取XML的两种方法。