어제는 HTML5 websocket과 Tomcat을 사용하여 다자간 채팅을 구현해봤습니다. 가장 간단하고 가장 기본적으로 주목해야 할 것은 jdk1.7과 tomcat8을 반드시 충족해야 하는 개발 환경입니다. 또한 작동합니다!
오늘은 국경절 마지막날이라 야근도 하고 코딩도 계속해야해요! 다행히 Google을 사용하여 websocket에 대한 P2P 채팅을 찾았습니다. 더 좋은 점은 대부분의 시스템에서 잘 작동한다는 것입니다. 렌더링을 살펴보세요.
시뮬레이션되었기 때문에 여기에 제공된 것은 두 개의 JSP 페이지 A와 B이며, 두 개의 이름 Xiaoming 및 Xiaohua를 각각 세션에 넣었습니다. 여기서 세션은 HttpSession 세션이고 이전 다중 사용자 채팅의 세션은 javax입니다. .websocket.Session이 다릅니다.
여기서 생각해 보세요. HttpSession 세션을 사용하여 채팅 사용자를 제어하면 어떤 이점이 있는지 추측해 보세요~~
여기서는 주석을 사용하지 않습니다. 기존 web.xml 구성 방법에서는 시스템이 시작될 때 InitServlet 메서드가 먼저 호출됩니다.
public class InitServlet은 HttpServlet을 확장합니다. { private static final long serialVersionUID = -3163557381361759907L; private static HashMap<String,MessageInbound> SocketList; public void init(ServletConfig config)는 ServletException을 발생시킵니다. { InitServlet.socketList = new HashMap<String,MessageInbound>(); super.init(config); System.out.println(채팅 컨테이너 초기화); } public static HashMap<String,MessageInbound> getSocketList() { return InitServlet.socketList } }
여기에서 이를 자신의 시스템과 결합할 수 있습니다. 해당 웹 구성 코드는 다음과 같습니다.
<?xml 버전=1.0 인코딩=UTF-8?><웹 앱 버전=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 ><!--메소드 실행 수준--> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
이는 프런트 데스크가 백그라운드로 요청을 보내는 가장 일반적인 프로세스이며, 자체 시스템에 쉽게 포함시킬 수도 있습니다.
MyWebSocketServlet:
public class MyWebSocketServlet은 WebSocketServlet을 확장합니다. { public String getUser(HttpServletRequest request){ String userName = (String) request.getSession().getAttribute(user); if(userName==null){ return null } protected StreamInbound createWebSocketInbound; (문자열 arg0, HttpServletRequest 요청) { System.out.println(user + request.getSession().getAttribute(user) + login) return new MyMessageInbound(this.getUser(request));
MyMessageInbound는 MessageInbound를 상속합니다.
패키지 소켓;가져오기 java.io.IOException;가져오기 java.nio.ByteBuffer;가져오기 java.nio.CharBuffer;가져오기 java.util.HashMap;가져오기 org.apache.catalina.websocket.MessageInbound;가져오기 org.apache.catalina.websocket .WsOutbound;import util.MessageUtil;public 클래스 MyMessageInbound는 MessageInbound를 확장합니다. { private String name; public MyMessageInbound() { super(); } public MyMessageInbound(String name) { super(); this.name = name; } @Override protected void onBinaryMessage(ByteBuffer arg0) throws IOException { } @Override protected void onTextMessage(CharBuffer msg) throws IOException { //사용자가 보낸 메시지를 처리한 후의 맵 HashMap<String,String> messageMap = MessageUtil.getMessage(msg); //메시지 클래스 처리 //온라인 사용자 컬렉션 클래스 맵 HashMap<String, MessageInbound> userMsgMap = InitServlet.getSocketList(); String fromName = messageMap.get(fromName); userId String toName = messageMap.get(toName); //메시지를 받은 사람의 userId //사용자의 MessageInbound 가져오기 messageInbound = userMsgMap.get(toName); //웨어하우스에 있는 사람에게 전송된 MessageInbound 가져오기 MessageInbound messageFromInbound = userMsgMap.get(fromName); if(messageInbound!=null && messageFromInbound!=null){ //발신자가 존재하는 경우 수행 작업 WsOutbound outbound = messageInbound.getWsOutbound() WsOutbound outFromBound = messageFromInbound.getWsOutbound(); String content = messageMap.get(content); //메시지 내용 가져오기 String msgContentString = fromName + say: + content; //전송할 메시지 구성 //컨텐츠 CharBuffer toMsg = CharBuffer. Wrap(msgContentString .toCharArray()); CharBuffer fromMsg = CharBuffer.wrap(msgContentString.toCharArray()); outFromBound.writeTextMessage(toMsg); // outFromBound.flush(); } } @Override protected void onClose(int status) { InitServlet.getSocketList().remove(this) ; super.onClose(status) } @Override protected void onOpen(WsOutbound 아웃바운드) super.onOpen(outbound); //로그인한 사용자가 등록되었습니다. if(name!=null){ InitServlet.getSocketList().put(name, this);//스토리지 고객 서비스 ID 및 사용자} } @Override public int getReadTimeout( ) { 반환 0 } }
onTextMessage의 포그라운드에서 보낸 정보를 처리하고 해당 정보를 대상에 캡슐화합니다.
messageutil 도 있습니다
package util;import java.nio.CharBuffer;import java.util.HashMap;public class MessageUtil { public static HashMap<String,String> getMessage(CharBuffer msg) { HashMap<String,String> map = new HashMap<String,String> (); 문자열 msgString = msg.toString(); msgString.split(,); map.put(fromName, m[0]); map.put(content, m[2]);
물론 프런트 데스크에서도 규정된 형식으로 정보를 전송해야 합니다.
<%@ 페이지 언어=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>색인</title><script type=text/javascript src=js/jquery-1.7.2.min.js></script><%session.setAttribute(user, 최소화);%><script type=text/javascript>var ws = null;function startWebSocket() { if (창의 'WebSocket') ws = new WebSocket(ws://localhost:8080/WebSocketUser/websocket.do); else if (창의 'MozWebSocket') ws = new MozWebSocket(ws://localhost:8080/WebSocketUser/websocket.do); else Alert(지원되지 않음) ws.onmessage = function(evt) { //alert(evt.data ); console.log(evt); // $(#xiaoxi).val(evt.data); }; function setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += innerHTML + '<br/>' } ws.onclose = function(evt) { //alert(close); 'denglu').innerHTML=offline; ws.onopen = function(evt) { //alert(open); document.getElementById('denglu').innerHTML=online; document.getElementById('userName').innerHTML='xiaohua'; };}function sendMsg() { var fromName = xiaoxing; ').value; //보내는 사람 var content = document.getElementById('writeMsg').value; //컨텐츠 보내기 ws.send(fromName+,+toName+,+content);//형식에 주의하세요}</script></head><body onload=startWebSocket();><p>채팅 기능 구현</script></head> p> 로그인 상태: <span id=denglu style=color:red;>로그인 중</span><br>로그인 사용자: <span id=userName></span><br><br><br>받는 사람 : < 입력 유형=텍스트 id=name value=작은명></input><br>콘텐츠 보내기: <input type=text id=writeMsg></input><br>채팅 상자: <div id=message style=height: 250px;width: 280px ;테두리: 1px 솔리드; 오버플로: 자동;></div><br><입력 유형=버튼 값=전송 onclick=sendMsg()></input></body></html>
A.jsp 페이지이고, B는 위와 동일합니다.
위 코드를 통해 지점 간 채팅 기능을 구현할 수 있으며, 대규모라면 채팅방, 1인 채팅 등 웹 버전의 채팅 시스템으로 만들 수도 있다고 한다. websocket은 바이너리 전송을 지원하지 않지만 Liu가 이런 말을 하는 것을 보았습니다.
하지만 지금은 바이너리를 사용하는 것이 그다지 의미가 없다고 느낍니다. JS는 바이너리를 지원하지 않는다고 해서 오랫동안 헷갈렸는데, 실제로는 이것을 연구하지 않은 사기꾼들일 뿐이라는 것을 알게 되었습니다. . (파일리더 사용)
위의 내용은 이 기사의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. 또한 모든 분들이 VeVb Wulin Network를 지지해 주시길 바랍니다.