Tomcat7支持WebSocket

jopen 11年前發布 | 39K 次閱讀 Tomcat7 Tomcat 應用服務器

今天研究了一下tomcat7的websocket,首先我們看看chrome瀏覽器的支持的js代碼,html5支持websocket

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>

</head>

<script type="text/javascript">
    var ws = null;
    function startServer() {
        var url = "ws://192.168.1.109/websocket/helloWorld";
        if ('WebSocket' in window) {
            ws = new WebSocket(url);

        } else if ('MozWebSocket' in window) {

            ws = new MozWebSocket(url);

        } else {
            alert('瀏覽器不支持');
            return;

        }
        ws.onopen = function() {
            //alert('Opened!');
        };
        // 收到服務器發送的文本消息, event.data表示文本內容
        ws.onmessage = function(event) {
            alert('Receive message: ' + event.data);
        };
        ws.onclose = function() {
        //  alert('Closed!');
            }
}
    //發送信息
    function sendMessage(){
        var textMessage=document.getElementById("textMessage").value;

        if(ws!=null&&textMessage!=""){
            ws.send(textMessage);

        }
    }
</script>
<body onload="startServer()">

        <input type="text" id="textMessage" size="20" />

        <input type="button" onclick="sendMessage()" value="Send">

    </body>

</html>

上面主要是JS的代碼,主要是瀏覽器發送socket給tomcat7,和結束tomcat返回的信息

在web項目中,我們要建一個servlet

package com.auscend.servlet;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;


import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
public class HelloWorldWebSocketServlet extends WebSocketServlet{


    protected StreamInbound createWebSocketInbound(String subProtocol){


         return new MessageInbound() {


            @Override
            protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
                // TODO Auto-generated method stub

            }

            @Override
            protected void onTextMessage(CharBuffer message) throws IOException {
                // TODO Auto-generated method stub
                System.out.println("onText--->"+message.toString());
                Socket socket;
                String msg = "";
                try {
                    //向服務器利用Socket發送信息
                    socket = new Socket("192.168.1.109", 5000);
                    // socket = new Socket("127.0.0.1",5000);
                    PrintWriter output = new PrintWriter(socket.getOutputStream());

                    output.write(message.toString());
                    output.flush();

                    //這里是接收到Server的信息
                    DataInputStream input = new DataInputStream(socket.getInputStream());
                    byte[] b = new byte[1024];
                    input.read(b);
                    //Server返回的信息
                    msg = new String(b).trim();

                    output.close();
                    input.close();
                    socket.close();
                }
                catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
                //往瀏覽器發送信息
                CharBuffer cb = CharBuffer.wrap(new StringBuilder(msg));
                getWsOutbound().writeTextMessage(cb);
            }};}}



    

下面是Server,相當于中央機
public class Server {

    /** 端口號 */
    public static final int PORT = 5000;

    public static void main(String[] args) {
        System.out.println("服務器...\n");
        Server ser = new Server();
        ser.sock();
    }

    public void sock() {
        try {
            ServerSocket server = new ServerSocket(PORT);
            while (true) {
                // 一旦有堵塞, 則表示服務器與客戶端獲得了連接
                Socket client = server.accept();
                // 處理這次連接
                new PServer(client);
            }
        } catch (Exception e) {
            System.out.println("服務器異常: " + e.getMessage());
        }
    }

    private class PServer implements Runnable {

        private Socket socket;

        public PServer(Socket sock) {
            socket = sock;
            new Thread(this).start();
        }

        public void run() {
            System.out.println("一個客戶端連接ip:" + socket.getInetAddress());
            try {
                // 讀取客戶端數據
                DataInputStream input = new DataInputStream(
                        socket.getInputStream());
                // 向客戶端發送數據
                DataOutputStream out = new DataOutputStream(
                        socket.getOutputStream());

                // 讀取客戶端數據
                // System.out.println("客戶端發過來的內容: " + input.readUTF());

                byte[] bt = new byte[1024];
                int leng = input.read(bt);

                System.out.println(new String(bt, 0, leng));

                // 發送鍵盤輸入的一行
                // String s = new BufferedReader(new
                // InputStreamReader(System.in)).readLine();
                String s = "server d shu ru";

                out.write(s.getBytes());
                out.flush();
                input.close();
                out.close();
                socket.close();
            } catch (Exception e) {
                System.out.println("服務器 run 異常: " + e.getMessage());
            }
        }

    }

}


這里的tomcat是使用的tomcat7.0.28,其他版本方法有點改動,好像是加了一個request的參數。

來自:http://blog.csdn.net/a79412906/article/details/9393515

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!