需求:要做一个两个安卓设备,通过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);
- 服务端接收消息
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){
}
}
主要记录,客户端给服务端推送照片数据,其他数据类似。