Android WebSocket服务端,客户端简单实现图片帧交互

需求:要做一个两个安卓设备,通过webSocket 连接,一台向另一台传输相机图片数据,形成预览。调研以后做出如下demo。代码比较简单,仅供参考。

服务端:

第一步:build.gradle 集成:

implementation 'com.rabtman.wsmanager:wsmanager:1.0.2'//websocket使用
implementation 'org.java-websocket:Java-WebSocket:1.5.1'

第二步:权限

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

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

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

第三步:ServerSocket 类

public class ServerSocket extends WebSocketServer {

    private ServerManager _serverManager;
    private XtzgWebSocketSurfaceViewActivity activity;

    public ServerSocket(ServerManager serverManager,int port,XtzgWebSocketSurfaceViewActivity activity1) throws UnknownHostException {
        super(new InetSocketAddress(port));
        _serverManager=serverManager;
        activity=activity1;
    }




    @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());

        activity.backUp( message);

        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() {

    }
}

第三步:ServerSocket 管理类:ServerManager

public class ServerManager {
    private ServerSocket serverSocket=null;
    private Map<WebSocket, String> userMap=new HashMap<WebSocket, String>();
    private XtzgWebSocketSurfaceViewActivity activity;
    public ServerManager(XtzgWebSocketSurfaceViewActivity activity1){
        activity=activity1;
    }

    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<WebSocket> 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<WebSocket> 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,activity);
            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;
        }
    }


}

第四步:服务端布局文件

<ImageView
    android:id="@+id/action_image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

第五步:Activity

private ImageView action_image;

ServerManager serverManager = new ServerManager(XtzgWebSocketSurfaceViewActivity.this);

action_image = findViewById(R.id.action_image);
serverManager.Start(8800);

  1. 服务端接收消息
public void backUp(String message) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {

            try {

                Bitmap bitmap = null;
                try {
                    byte[] bitmapArray;
                    bitmapArray = Base64.decode(message, Base64.DEFAULT);
                    bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0,
                            bitmapArray.length);
                } catch (Exception e) {
                    e.printStackTrace();
                }


                action_image.setImageBitmap(bitmap);
            } catch (Exception e) {

            }


            toast(message.length());
        }
    });
}

客户端:

第一步:build.gradle 集成:

implementation 'com.rabtman.wsmanager:wsmanager:1.0.2'//websocket使用
implementation 'org.java-websocket:Java-WebSocket:1.5.1'

第二步:权限

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

第三步:用法

public class MyWebSocketClient extends WebSocketClient {

        public MyWebSocketClient(String serverUrl) throws URISyntaxException {
            super(new URI(serverUrl));
            Log.d("@@@@@@@@@@@@@@@", "MyWsManager-----onMessage");
        }

        @Override
        public void onOpen(ServerHandshake handshake) {
            isconnect= true;
            //  WebSocket连接已成功建立
            // 在此执行任何必要的操作
            Log.d("@@@@@@@@@@@@@@@", "MyWsManager-----onMessage");


        }

        @Override
        public void onMessage(String message) {
            //  处理来自服务器的传入消息

//            if (message.equals("4") && isUp) {
//                getAllDate();
//            }

        }

        @Override
        public void onClose(int code, String reason, boolean remote) {
            //  WebSocket连接已关闭
            //  在此执行任何必要的清理操作
            isconnect = false;
            Log.d("@@@@@@@@@@@@@@@", "MyWsManager-----onMessage");
            restart();
        }

        @Override
        public void onError(Exception ex) {
            // 处理WebSocket连接期间发生的任何错误
            Log.d("@@@@@@@@@@@@@@@", "MyWsManager-----onMessage");
        }
    }

private MyWebSocketClient client;
private boolean isconnect = false;

 

try {
    client = new MyWebSocketClient("ws://192.168.1.100:8800");
    client.connect();
} catch (URISyntaxException e) {
    e.printStackTrace();
}

private void restart() {//断开重连
    new Thread(new Runnable() {
        @Override
        public void run() {
            if (client != null) {
                client.close();
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                startWebsocket();

            }

        }
    }).start();
}

图片帧发送

Bitmap data222 = null;//传入图片帧



data222.compress(Bitmap.CompressFormat.JPEG, 50, bStream);
byte[] bytes = bStream.toByteArray();
String xxdata222 = Base64.encodeToString(bytes, Base64.DEFAULT);
if (client!=null && isconnect){
    try {
        client.send(xxdata222);

    }catch (Exception e){

    }
}

主要记录,客户端给服务端推送照片数据,其他数据类似。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值