Kemarin saya menggunakan websocket HTML5 dan Tomcat untuk mengimplementasikan obrolan multi-orang. Ini yang paling sederhana dan mendasar. Yang paling penting untuk diperhatikan adalah lingkungan pengembangan, yang harus memenuhi jdk1.7 dan Tomcat8 juga akan berhasil!
Hari ini adalah hari terakhir Hari Nasional, jadi saya harus bekerja lembur dan terus membuat kode! Untungnya, saya menggunakan Google untuk menemukan obrolan peer-to-peer tentang websocket. Yang lebih baik lagi adalah Google dapat bekerja dengan baik pada sebagian besar sistem.
Karena disimulasikan, yang diberikan di sini adalah dua halaman JSP A dan B, yang masing-masing memasukkan dua nama Xiaoming dan Xiaohua ke dalam sesi. Perhatikan bahwa sesi di sini adalah sesi HttpSession, dan sesi di obrolan multi-orang sebelumnya adalah javax .websocket.Sesi; berbeda.
Coba pikirkan di sini, gunakan sesi HttpSession untuk mengontrol pengguna obrolan, coba tebak apa manfaatnya~~~
Anotasi tidak digunakan di sini. Dalam metode konfigurasi web.xml tradisional, metode InitServlet dipanggil pertama kali saat sistem dijalankan.
kelas publik InitServlet extends HttpServlet { private static final long serialVersionUID = -3163557381361759907L; private static HashMap<String,MessageInbound> socketList; public void init(ServletConfig config) throws ServletException { InitServlet.socketList = new HashMap<String,MessageInbound>(); super.init(config); System.out.println(inisialisasi wadah obrolan); } HashMap statis publik<String,MessageInbound> getSocketList() { return InitServlet.socketList;
Di sini Anda dapat menggabungkannya dengan sistem Anda sendiri. Kode konfigurasi web yang sesuai adalah sebagai berikut:
<?xml version=1.0 coding=UTF-8?><web-app version=3.0 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org /2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd> <servlet> <servlet-name>websocket</servlet-name> <servlet-class>socket.MyWebSocketServlet</servlet-class > </servlet> <servlet-mapping> <servlet-name>websocket</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet> <servlet-name>initServlet</servlet-name> <servlet-class>socket.InitServlet</servlet-class> <load-on-startup>1</load-on-startup ><!--Tingkat eksekusi metode--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </daftar-file-selamat datang></aplikasi web>
Ini adalah proses paling umum bagi meja depan untuk mengirim permintaan ke latar belakang, dan juga mudah untuk diintegrasikan ke dalam sistem Anda sendiri.
Server WebSocket Saya:
kelas publik MyWebSocketServlet memperluas WebSocketServlet { public String getUser(HttpServletRequest request){ String userName = (String) request.getSession().getAttribute(user); if(userName==null){ return null; } return userName } dilindungi StreamInbound createWebSocketInbound (String arg0, permintaan HttpServletRequest) { System.out.println(pengguna + permintaan.getSession().getAttribute(pengguna) + login); kembalikan MyMessageInbound baru(ini.getUser(permintaan) }}
MyMessageInbound mewarisi MessageInbound
paket soket;impor java.io.IOException;impor java.nio.ByteBuffer;impor java.nio.CharBuffer;impor java.util.HashMap;impor org.apache.catalina.websocket.MessageInbound;impor org.apache.catalina.websocket .WsOutbound;import util.MessageUtil;kelas publik MyMessageInbound extends MessageInbound { Private String nama; publik MyMessageInbound() { super(); } public MyMessageInbound(String nama) { super(); this.name = nama } @Override dilindungi void onBinaryMessage(ByteBuffer arg0) melempar IOException { } @Override dilindungi void onTextMessage(CharBuffer msg) melempar IOException {/ //Peta setelah memproses pesan yang dikirim oleh pengguna HashMap<String,String> messageMap = MessageUtil.getMessage(msg); //Memproses kelas pesan //Peta kelas koleksi pengguna online HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList(); userId dari orang yang menerima pesan String toName = messageMap.get(toName); //Id pengguna dari orang yang menerima pesan //Dapatkan MessageInbound pengguna messageInbound = userMsgMap.get(toName); //Dapatkan MessageInbound dikirim ke orang di gudang MessageInbound messageFromInbound = userMsgMap.get(fromName); operasi WsOutbound outbound = messageInbound.getWsOutbound(); messageFromInbound.getWsOutbound(); String content = messageMap.get(content); //Dapatkan isi pesan String msgContentString = fromName + say: + content; bungkus(msgContentString .toCharArray()); CharBuffer dariMsg = CharBuffer.wrap(msgContentString.toCharArray()); outFromBound.writeTextMessage(fromMsg); outbound.writeTextMessage(toMsg); // outFromBound.flush(); outbound.flush(); ; super.onClose(status); } @Override dilindungi void onOpen(WsOutbound) { super.onOpen(outbound); //Pengguna yang masuk telah terdaftar if(name!=null){ InitServlet.getSocketList().put(name, this);//ID layanan pelanggan penyimpanan dan pengguna} } @Override public int getReadTimeout( ) { kembali 0;
Memproses informasi yang dikirim oleh latar depan di onTextMessage dan merangkum informasi tersebut ke target.
Ada juga messageutil
paket util;import java.nio.CharBuffer;import java.util.HashMap;public class MessageUtil { public static HashMap<String,String> getMessage(CharBuffer msg) { HashMap<String,String> map = HashMap baru<String,String> (); String msgString = msg.toString(); String m[] = msgString.split(,); peta.put(dariNama, m[0]); peta.put(toName, m[1]); peta.put(konten, m[2]);
Tentu saja front desk juga harus menyampaikan informasi dalam format yang ditentukan.
<%@ halaman bahasa=java contentType=text/html; charset=UTF-8 pageEncoding=UTF-8%><!DOCTYPE html><html><head><meta http-equiv=Jenis Konten content=teks/html ; charset=UTF-8><title>Indeks</title><tipe skrip=teks/javascript src=js/jquery-1.7.2.min.js></script><%session.setAttribute(pengguna, minimalkan);%><script type=text/javascript>var ws = null;function startWebSocket() { if ('WebSocket' di jendela) ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do); ('MozWebSocket' di jendela) ws = new MozWebSocket(ws://localhost:8080/WebSocketUser/websocket.do); else alert(tidak mendukung ws.onmessage = function(evt) { //alert(evt.data ); konsol.log(evt); // $(#xiaoxi).val(evt.data); }; fungsi setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += innerHTML + '<br/>'; } ws.onclose = function(evt) { //alert(close); 'denglu').innerHTML=offline; }; ws.onopen = function(evt) { //peringatan(terbuka); document.getElementById('denglu').innerHTML=online; document.getElementById('userName').innerHTML='xiaohua'; };}function sendMsg() { var fromName = xiaoxing; var toName = document.getElementById( 'nama ').value; //Kepada siapa harus dikirim var content = document.getElementById('writeMsg').value; //Mengirim konten ws.send(fromName+,+toName+,+content);//Perhatikan format</script></head><body onload=startWebSocket();><p>Implementasi fungsi chat</ p> Status Masuk: <span id=denglu style=color:red;>Login</span><br>Orang yang masuk: <span id=userName></span><br><br><br>Kepada siapa : < tipe masukan=teks id=name value=小明></input><br>Kirim konten: <input type=text id=writeMsg></input><br>Kotak obrolan: <div id=message style=height: 250px;width: 280px ;batas: 1px padat; luapan: otomatis;></div><br><tipe input=nilai tombol=kirim onclick=sendMsg()></input></body></html>
Ini halaman A.jsp, B sama seperti di atas
Melalui kode di atas, fungsi chat point-to-point dapat diwujudkan, jika berskala besar dapat dibuat menjadi sistem chat versi web, termasuk chat room dan single-person chat websocket tidak mendukung transmisi biner, tetapi saya melihat Liu besar mengatakan sesuatu seperti ini
Namun sekarang saya merasa menggunakan biner tidak terlalu berarti. Saya sudah lama bingung. Dikatakan bahwa JS tidak mendukung biner. Saya menemukan bahwa sebenarnya hanya sekelompok scammer yang belum mempelajarinya. . (Menggunakan pembaca file)
Di atas adalah keseluruhan isi artikel ini, saya harap dapat bermanfaat untuk pembelajaran semua orang. Saya juga berharap semua orang mendukung VeVb Wulin Network.