java_웹소켓안드로이드 메시지 전송 실현

7186 단어
배경.
회사의 프로젝트는 생방송과 관련된 것이기 때문에 자연스럽게 생방송과 채팅의 기능을 가지게 된다. 많은 생방송과 마찬가지로 우리는 환신을 선택했다. 환신의 접속과 사용은 상대적으로 편리하다. 그러나 생방송 인원이 늘어나면서 심각한 문제가 생겼다. 우리는 이차원이라고 부른다. 생방송에 들어가면 다른 사람의 상호작용을 볼 수 없고 혼자 노는 것도 즐겁지 않다.남들도 안 보이는데..
문제의 심각성을 고려하여 우리는 웹 소켓을 바꾸기로 결정했다.
웹소켓 소개
생방송 중의 실시간 통신이기 때문에 메시지의 발송이 매우 빈번할 것이다. 만약에 http 요청을 하면 모든 메시지를 보내면 새로운 링크를 만들고 발송할 것이다. 이것은 치명적인 것이다. 웹 소켓은 새로운 프로토콜로 긴 연결을 한 번에 연결한 후에 여러 번 메시지를 보낼 수 있고 생방송을 종료할 때 연결을 끊으면 된다.구체적으로 이 글을 볼 수 있는데 웹소켓은 어떤 원리입니까?왜 지속적인 연결을 실현할 수 있습니까?
프로젝트 사용
1. 의존 추가, 채택한javawebSocket
compile “org.java-websocket:Java-WebSocket:1.3.0”
2. 클라이언트가 자바를 사용하여 웹소켓 client 구현
public class XZMsgClient extends WebSocketClient{

    public XZMsgClient(URI serverURI ) {
        super( serverURI, new Draft_17());
    }

    public void sendMsg(String text) throws NotYetConnectedException {
        //write a message
        send(text);
    }

    @Override
    public void onOpen( ServerHandshake handshakedata ) {
        System.out.println( "opened connection" );
        // if you plan to refuse connection based on ip or httpfields overload: onWebsocketHandshakeReceivedAsClient
    }


    @Override
    public void onMessage( String message ) {

        message.matches("/^id: (.*)
(content-type: (.*)
)?
/m"
); } /* @Override public void onFragment( Framedata fragment ) { System.out.println( "received fragment: " + new String( fragment.getPayloadData().array() ) ); }*/ @Override public void onClose( int code, String reason, boolean remote ) { // The codecodes are documented in class org.java_websocket.framing.CloseFrame System.out.println( "Connection closed by " + ( remote ? "remote peer" : "us" ) ); } @Override public void onError( Exception ex ) { ex.printStackTrace(); // if the error is fatal then onClose will be called additionally } }

3. 웹SocketClient 인스턴스를 만들고 메서드를 다시 작성합니다.
    /**
     *   websocket  
     */
    private void createWebSocket() {
        xzMsgClient = new XZMsgClient(uri) {
            @Override
            public void onOpen(ServerHandshake handshakedata) {
                super.onOpen(handshakedata);
                Log.i("Websocket", "Opened");

                if (mUser != null) {

                    String messageContent = "   " + mUser.usernickname + "      ";
                    String msg = getJsonMessage(messageContent, Enter_OR_LEAVE, "", "1");

                    xzClientSendMessage(msg);
                }
            }

            @Override
            public void onMessage(String message) {
                super.onMessage(message);
                Log.e(TAG, "onMessage:       " + message);

                mHandler.post(new Runnable() {
                    @Override
                    public void run() {

                        //    
                        dealMessage(message);
                    }
                });
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {
                super.onClose(code, reason, remote);

                Log.i("Websocket", "Closed " + reason);
            }

            @Override
            public void onError(Exception ex) {
                super.onError(ex);
                Log.i("Websocket", "Error " + ex.getMessage());
            }
        };

        xzMsgClient.connect();
    }

4. 간단한 설명
  • 서버: 백엔드에서 nchan을 사용하여 채팅 서버를 구축하고 클라이언트에게 주소를 제공한다. 즉uri이다. 클라이언트가 웹소켓클라이언트를 만들 때 이를 매개 변수로 전송한다.
  • uri: 웹소켓 프로토콜의uri는 시작하는 http를 ws로 바꿉니다. 그렇지 않으면 채팅 서버에 연결할 수 없습니다.
  • 웹소켓 클라이언트 실례를 만들면connect()를 호출하고 연결이 성공한 후에야 온오픈()을 호출하여 생방송에 들어갑니다.
  • 생방송에 들어가면sendMsg()를 호출하여 메시지를 발송할 수 있으며 엄밀성을 확보하기 위해 메시지를 발송하기 전에 연결 성공을 확정할 수 있습니다.
    xzMsgClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)
  • 채팅창을 소각할 때 웹소켓 연결을 끊으면 됩니다
  • 참고 사항: 1.Java-WebSocket 2.웹소켓은android 메시지 전송을 실현합니다.Android에서 WebView에서 벗어나 WebSocket을 사용하여 단체 채팅과 전송 기능을 실현

    좋은 웹페이지 즐겨찾기