JavaWeb webSocket을 사용하여 간단한 점대점 채팅 기능 인스턴스 코드 구현

먼저 말씀드릴게요. jdk 7이 필요하고,tomcat은 웹소켓 버전을 지원해야 합니다.
1.InitServlet
이 클래스는 주로 장래에 사용자의 신분 정보를 저장할 맵 창고를 구축하는 데 사용되며, 그 초기화 방법인 init를 이용하여 창고를 초기화하고, 정적 방법인 getSocketList를 이용하여 대응하는 사용자의 신분 정보를 얻는다.
웹소켓, 나는 Message Inbound가 로그인한 사람의 정보를 식별하고 대응하는 사람을 찾아 메시지를 전송하는 데 사용된다고 생각한다.로그인할 때마다 MessageInbound가 생성됩니다.
여기 HashMap:string은 사용자 세션의 로그인 id를 저장하고, Message Inbound는 필요한 신분 정보를 전송합니다.이상은 개인의 구두 이해에 속한다.

package socket;
 import java.nio.CharBuffer;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import org.apache.catalina.websocket.MessageInbound;
 public class InitServlet extends HttpServlet {
   private static final long serialVersionUID = -L; 
   //private static List<MessageInbound> socketList;  
   private static HashMap<String,MessageInbound> socketList;  
   public void init(ServletConfig config) throws ServletException {  
 //    InitServlet.socketList = new ArrayList<MessageInbound>();  
     InitServlet.socketList = new HashMap<String,MessageInbound>();  
     super.init(config);  
     System.out.println("Server start============");  
   }  
   public static HashMap<String,MessageInbound> getSocketList() {  
     return InitServlet.socketList;  
   }  
 /*  public static List<MessageInbound> getSocketList() {  
     return InitServlet.socketList;  
   }  
 */}
2.MyWebSocketServlet 
웹소켓은 연결을 만드는 데 사용되는 servlet입니다. 연결을 만들 때, 세션에서 이 로그인자의userId를 가져오고, MyMessageInbound 구조 함수를 호출해서userId로 전송합니다.

package socket;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.nio.CharBuffer;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.apache.catalina.websocket.StreamInbound;
 import org.apache.catalina.websocket.WebSocketServlet;
 /**
 * 
 * @ClassName: MyWebSocketServlet 
 * @Description:   
 * @author mangues
 * @date --
 */
 public class MyWebSocketServlet extends WebSocketServlet {
   public String getUser(HttpServletRequest request){ 
     String userName = (String) request.getSession().getAttribute("user");
     if(userName==null){
       return null;
     }
     return userName; 
    // return (String) request.getAttribute("user"); 
   } 
   @Override
   protected StreamInbound createWebSocketInbound(String arg,
       HttpServletRequest request) {
     System.out.println("##########"); 
     return new MyMessageInbound(this.getUser(request)); 
   }
 } 
3.onOpen 메서드는 InitServlet의 맵 ID 저장소를 호출합니다.
사용자 userId와 로그인해야 할 사용자에 대한 웹소켓 신분 정보 넣기 MessageInbound (userId로 전송에 필요한 신분 MessageInbound를 찾을 수 있음)
onTextMessage: 메시지를 가져오고 보내는 데 사용

package socket;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.util.HashMap;
 import org.apache.catalina.websocket.MessageInbound;
 import org.apache.catalina.websocket.WsOutbound;
 import util.MessageUtil;
 public class MyMessageInbound extends MessageInbound {
   private String name;
   public MyMessageInbound() {
     super();
   }
   public MyMessageInbound(String name) {
     super();
     this.name = name;
   }
   @Override 
   protected void onBinaryMessage(ByteBuffer arg) throws IOException { 
     // TODO Auto-generated method stub 
   } 
   @Override 
   protected void onTextMessage(CharBuffer msg) throws IOException { 
     // map
     HashMap<String,String> messageMap = MessageUtil.getMessage(msg);  // 
     // map
     HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList();
     String fromName = messageMap.get("fromName");  //   userId
     String toName = messageMap.get("toName");     //  userId
     // 
     MessageInbound messageInbound = userMsgMap.get(toName);  // MessageInbound
     if(messageInbound!=null){   //   
       WsOutbound outbound = messageInbound.getWsOutbound(); 
       String content = messageMap.get("content"); // 
       String msgContentString = fromName + "   " + content;  // 
       // 
       CharBuffer toMsg = CharBuffer.wrap(msgContentString.toCharArray());
       outbound.writeTextMessage(toMsg); //
       outbound.flush();
     }
    /* for (MessageInbound messageInbound : InitServlet.getSocketList()) { 
       CharBuffer buffer = CharBuffer.wrap(msg); 
       WsOutbound outbound = messageInbound.getWsOutbound(); 
       outbound.writeTextMessage(buffer); 
       outbound.flush(); 
     } */
   } 
   @Override 
   protected void onClose(int status) { 
     InitServlet.getSocketList().remove(this); 
     super.onClose(status); 
   } 
   @Override 
   protected void onOpen(WsOutbound outbound) { 
     super.onOpen(outbound); 
     // 
     if(name!=null){
       InitServlet.getSocketList().put(name, this); 
     }
 //    InitServlet.getSocketList().add(this); 
   } 
 }
4. 메시지 처리 클래스, 전방에서 보내는 메시지 처리

 package util;
 import java.nio.CharBuffer;
 import java.util.HashMap;
 /**
  * 
  * @ClassName: MessageUtil 
  * @Description:  
  * @author mangues
 * @date --
 */
 public class MessageUtil {
   public static HashMap<String,String> getMessage(CharBuffer msg) {
     HashMap<String,String> map = new HashMap<String,String>();
     String msgString = msg.toString();
     String m[] = msgString.split(",");
     map.put("fromName", m[]);
     map.put("toName", m[]);
     map.put("content", m[]);
     return map;
   }
 }
5.웹 구성

<?xml version="1.0" encoding="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>mywebsocket</servlet-name> 
  <servlet-class>socket.MyWebSocketServlet</servlet-class> 
 </servlet> 
 <servlet-mapping> 
  <servlet-name>mywebsocket</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> 
 </servlet> 
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
</web-app>
6, 전단, 편의를 위해 나는 직접 두 개의 jsp를 사용했는데 그 중에서 <%session을 사용했다.setAttribute("user", "샤오밍")%>;로그인을 표시합니다.
두 jsp는 아무런 본질적인 차이가 없다. 단지 두 명의 다른 사람이 로그인하고 두 브라우저와 다른 jsp를 열어 채팅을 할 수 있다는 것을 나타낼 뿐이다.
A.소화

<%@ page language="java" contentType="text/html; charset=UTF-"
   pageEncoding="UTF-"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-">
 <title>Index</title>
 <script type="text/javascript" src="js/jquery ...min.js"></script>
 <%session.setAttribute("user", " ");%>
 <script type="text/javascript">
 var ws = null;
 function startWebSocket() {
   if ('WebSocket' in window)
     ws = new WebSocket("ws://localhost:/webSocket/mywebsocket.do");
   else if ('MozWebSocket' in window)
     ws = new MozWebSocket("ws://localhost:/webSocket/mywebsocket.do");
   else
     alert("not support");
   ws.onmessage = function(evt) {
     //alert(evt.data);
     console.log(evt);
     $("#xiaoxi").val(evt.data);
   };
   ws.onclose = function(evt) {
     //alert("close");
     document.getElementById('denglu').innerHTML=" ";
   };
   ws.onopen = function(evt) {
     //alert("open");
     document.getElementById('denglu').innerHTML=" ";
     document.getElementById('userName').innerHTML=' ';
   };
 }
 function sendMsg() {
   var fromName = " ";
   var toName = document.getElementById('name').value; // 
   var content = document.getElementById('writeMsg').value; // 
   ws.send(fromName+","+toName+","+content);
 }
 </script>
 </head>
 <body onload="startWebSocket();">
 <p> </p>
  :
 <span id="denglu" style="color:red;"> </span>
 <br>
  :
 <span id="userName"></span>
 <br>
 <br>
 <br>
  :<input type="text" id="name" value=" "></input>
 <br>
  :<input type="text" id="writeMsg"></input>
 <br>
  :<textarea rows="" cols="" readonly id="xiaoxi"></textarea>
 <br>
 <input type="button" value="send" onclick="sendMsg()"></input>
 </body>
 </html>
B.샤오밍

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
<script type="text/javascript" src="js/jquery 2.1.1.min.js"></script>
<%session.setAttribute("user", " ");%>
<script type="text/javascript">
var ws = null;
function startWebSocket() {
  if ('WebSocket' in window)
    ws = new WebSocket("ws://localhost:8080/webSocket/mywebsocket.do");
  else if ('MozWebSocket' in window)
    ws = new MozWebSocket("ws://localhost:8080/webSocket/mywebsocket.do");
  else
    alert("not support");
  ws.onmessage = function(evt) {
    console.log(evt);
    //alert(evt.data);
    $("#xiaoxi").val(evt.data);
  };
  ws.onclose = function(evt) {
    //alert("close");
    document.getElementById('denglu').innerHTML=" ";
  };
  ws.onopen = function(evt) {
    //alert("open");
    document.getElementById('denglu').innerHTML=" ";
    document.getElementById('userName').innerHTML=" ";
  };
}
function sendMsg() {
  var fromName = " ";
  var toName = document.getElementById('name').value; // 
  var content = document.getElementById('writeMsg').value; // 
  ws.send(fromName+","+toName+","+content);
}
</script>
</head>
<body onload="startWebSocket();">
<p> </p>
 :
<span id="denglu" style="color:red;"> </span>
<br>
 :
<span id="userName"></span>
<br>
<br>
<br>
 :<input type="text" id="name" value=" "></input>
<br>
 :<input type="text" id="writeMsg"></input>
<br>
 :<textarea rows="13" cols="100" readonly id="xiaoxi"></textarea>
<br>
<input type="button" value="send" onclick="sendMsg()"></input>
</body>
</html>
위에서 설명한 것은 자바 웹 소켓을 사용하여 간단한 점대점 채팅 기능의 실례 코드를 실현하는 것에 관한 지식입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주시면 제때에 답장해 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기