mina 기반 자바 서버 와 html 5 websocket 의 간단 한 온라인 채 팅 방
구체 적 인 웹 소켓 의 악수 프로그램 과 디 코딩 인 코딩 은 아래 링크 를 참조 할 수 있 습 니 다.
http://www.cnblogs.com/pctzhang/archive/2012/02/19/2358496.html
웹 소켓 의 코드 는 쓰기 싫 을 정도 로 간단 합 니 다.
다음은 주요 자바 코드 인 mina 기반 입 니 다.관심 있 으 면 프로젝트 다 내 려 가서 혼자 놀아 요.
package websocket;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author amu
*
*/
public class WebSocketIoHandler extends IoHandlerAdapter {
public static final String INDEX_KEY = WebSocketIoHandler.class.getName() + ".INDEX";
private static Logger LOGGER = LoggerFactory.getLogger(WebSocketIoHandler.class);
Map ioSessionMap = new HashMap();
public void messageReceived(IoSession session, Object message) throws Exception {
IoBuffer buffer = (IoBuffer)message;
byte[] b = new byte[buffer.limit()];
buffer.get(b);
Long sid = session.getId();
if (!ioSessionMap.containsKey(sid)) {
LOGGER.info("user '{}',has been created" + sid);
ioSessionMap.put(sid, session);
String m = new String(buffer.array());
String sss = getSecWebSocketAccept(m);
buffer.clear();
buffer.put(sss.getBytes("utf-8"));
buffer.flip();
session.write(buffer);
buffer.free();
} else {
String m = decode(b);
LOGGER.info("from client is :" + m);
buffer.clear();
byte[] bb = encode(m);
buffer.put(bb);
buffer.flip();
synchronized (ioSessionMap) {
Collection ioSessionSet = ioSessionMap.values();
for (IoSession is : ioSessionSet) {
if (is.isConnected()) {
System.out.println("response message to " + is);
is.write(buffer.duplicate());
}
}
}
buffer.free();
}
}
@Override
public void sessionOpened(IoSession session) throws Exception {
session.setAttribute(INDEX_KEY, 0);
}
@Override
public void sessionIdle( IoSession session, IdleStatus status ) throws Exception {
System.out.println( "IDLE " + session.getIdleCount( status ));
}
public static String getSecWebSocketAccept(String key) {
String secKey = getSecWebSocketKey(key);
String guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
secKey += guid;
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(secKey.getBytes("iso-8859-1"), 0, secKey.length());
byte[] sha1Hash = md.digest();
secKey = base64Encode(sha1Hash);
} catch (Exception e) {
e.printStackTrace();
}
String rtn = "HTTP/1.1 101 Switching Protocols\r
Upgrade: websocket\r
Connection: Upgrade\r
Sec-WebSocket-Accept: "
+ secKey + "\r
\r
";
return rtn;
}
public static String getSecWebSocketKey(String req) {
Pattern p = Pattern.compile("^(Sec-WebSocket-Key:).+",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher m = p.matcher(req);
if (m.find()) {
String foundstring = m.group();
return foundstring.split(":")[1].trim();
} else {
return null;
}
}
public static String base64Encode(byte[] input) {
return new String(org.apache.mina.util.Base64.encodeBase64(input));
}
// /
// /
// / :hi
// / socket :
// / 1000000110000010 1101011011101001
// / 111110 111000 10111110 10000000
// / :
// / 111110 111000 10111110 10000000
// / ^ 111110 111001 11010110 11101001
// / : 1101000 1101001
// / :
// / [0] 129 byte
// / [1] 130 byte
// / [2] 214 byte
// / [3] 233 byte
// / [4] 62 byte
// / [5] 56 byte
// / [6] 190 byte
// / [7] 128 byte
// /
// /
public static String decode(byte[] receivedDataBuffer)
throws UnsupportedEncodingException {
String result = null;
//
int lastStation = receivedDataBuffer.length - 1;
// org-data
int frame_masking_key = 1;
for (int i = 6; i <= lastStation; i++) {
frame_masking_key = i % 4;
frame_masking_key = frame_masking_key == 0 ? 4 : frame_masking_key;
frame_masking_key = frame_masking_key == 1 ? 5 : frame_masking_key;
receivedDataBuffer[i] = (byte) (receivedDataBuffer[i] ^ receivedDataBuffer[frame_masking_key]);
}
result = new String(receivedDataBuffer, 6, lastStation - 5, "UTF-8");
return result;
}
// /
public static byte[] encode(String msg) throws UnsupportedEncodingException {
//
int masking_key_startIndex = 2;
byte[] msgByte = msg.getBytes("UTF-8");
//
if (msgByte.length <= 125) {
masking_key_startIndex = 2;
} else if (msgByte.length > 65536) {
masking_key_startIndex = 10;
} else if (msgByte.length > 125) {
masking_key_startIndex = 4;
}
//
byte[] result = new byte[msgByte.length + masking_key_startIndex];
// ws-frame
// frame-fin + frame-rsv1 + frame-rsv2 + frame-rsv3 + frame-opcode
result[0] = (byte) 0x81; // 129
// frame-masked+frame-payload-length
// 9 1111101=125, 3- 6
// 9 1111110>=126, 5- 8
if (msgByte.length <= 125) {
result[1] = (byte) (msgByte.length);
} else if (msgByte.length > 65536) {
result[1] = 0x7F; // 127
} else if (msgByte.length > 125) {
result[1] = 0x7E; // 126
result[2] = (byte) (msgByte.length >> 8);
result[3] = (byte) (msgByte.length % 256);
}
//
for (int i = 0; i < msgByte.length; i++) {
result[i + masking_key_startIndex] = msgByte[i];
}
return result;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HTML5] EmmetHTML5에서는 셀렉터를 이용해 여러 요소를 한 줄로 작성할 수 있다. 분명 이런 문법 명칭이 있을 텐데, 찾지 못해서 뭐라고 칭해야 하는지 모르겠다. 누군가가 알려주셨으면 좋겠다. ㅠㅠ 22.04.07 18:42 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.