安卓WebSocket使用

时间:2024-01-27 17:17:43

引入jar包:

   implementation "org.java-websocket:Java-WebSocket:1.4.0"
implementation "org.slf4j:slf4j-nop:1.7.25"


websocket相对于socket是页面和页面进行通信,比socket要好用点

先看服务端start之后就一直监听客户端的连接,可以连接多个客户端生成多个Websocket实例

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );




    }


    public static void main(String[] args) throws IOException {

        final ChatServer chatServer = new ChatServer( 9999 );

        chatServer.start();

    }
public class ChatServer extends WebSocketServer {

    private WebSocket webSocket;

    public ChatServer(int port){
        super(new InetSocketAddress(port));
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        System.out.println("服务端打开"+conn.getLocalSocketAddress().getAddress().getHostAddress() );

        webSocket=conn;
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        System.out.println("服务端关闭");
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        System.out.println("服务端收到消息");
        conn.send( "服务端发送的消息" );
        webSocket=conn;
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {

        System.out.println("服务端错误"+ex.getMessage() );
    }

    @Override
    public void onStart() {

        System.out.println("服务端开始");
    }

    public void sendMsg(String content){
        if(webSocket!=null) {
            webSocket.send(content);
        }
        else {
            System.out.println("请先初始化" );

        }
    }
}

如果有客户端连接会执行onopen方法

然后是客户端:

public class MainActivity3 extends AppCompatActivity {
    private ChatClient instance;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main3 );
        URI uri = URI.create( "ws://xx.xx.x.xx:9999" );
         instance = ChatClient.getInstance( uri );

        new Thread() {
            @Override
            public void run() {
                try {
                    //connectBlocking多出一个等待操作,会先连接再发送,否则未连接发送会报错
                    instance.connectBlocking();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        findViewById( R.id.main3button1 ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                instance.send( "是的咖啡机" );
            }
        } );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {
            if (null != instance) {
                instance.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            instance = null;
        }
    }
}
public class ChatClient extends WebSocketClient {

    private static volatile ChatClient client = null;
    private Handler mHandler;

    public ChatClient(URI uri) {
        super(uri);

    }

    /**
     * DCL
     *
     * @param uri
     * @return
     */
    public static ChatClient getInstance(URI uri) {
        if (client == null) {
            synchronized (ChatClient.class) {
                if (client == null) {
                    client = new ChatClient(uri);
                }
            }
        }
        return client;
    }


    @Override
    public void onOpen(ServerHandshake handshakedata) {

        System.out.println("客户端打开"+handshakedata.getHttpStatusMessage());

    }

    @Override
    public void onMessage(String message) {
        System.out.println("收到信息"+message);

    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("客户端关闭");

    }

    @Override
    public void onError(Exception ex) {
        System.out.println("错误"+ex);
    }

}