package test
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.net.Socket;
import flash.text.TextField;
/**
* ...
* @author lizhi http://game-develop.net/
*/
public class TestMina extends Sprite
{
private var socket:Socket;
private var msglen:int = -1;
private var tf:TextField;
public function TestMina()
{
tf = new TextField;
addChild(tf);
tf.autoSize = "left";
socket = new Socket("127.0.0.1", 9123);
socket.addEventListener(Event.CONNECT, socket_connect);
socket.addEventListener(ProgressEvent.SOCKET_DATA, socket_socketData);
}
private function socket_socketData(e:ProgressEvent):void
{
read();
}
private function read():void {
if (msglen<0) {
//log("读长度");
if (socket.bytesAvailable>=2) {
msglen = socket.readShort();
read();
}
}else if (socket.bytesAvailable >= (msglen-2)) {
//log("读消息体");
var id:int = socket.readInt();
//log("消息id id:" + id);
switch(id){
case 1://其它玩家进入
var userId:int = socket.readInt();
log(userId,"进入");
break;
case 2://告诉玩家id并返回其它用户信息
userId = socket.readInt();
log("进入成功 你的id是:", userId);
var len:int = socket.readInt();
var arr:Array = [];
while (len-->0) {
userId = socket.readInt();
arr.push(userId);
}
if (arr.length > 0) {
log("其它用户:",arr);
}
break;
case 3://有用户退出
userId = socket.readInt();
log(userId,"退出");
break;
case 4://用户发言
userId = socket.readInt();
var str:int = socket.readInt();
log(userId+"说:",str);
break;
}
msglen = -1;
}
}
private function log(...args):void {
tf.appendText(args + "\n");
}
private function socket_connect(e:Event):void
{
stage.addEventListener(MouseEvent.CLICK, stage_click);
}
private function stage_click(e:MouseEvent):void
{
var v:int = Math.random() * 10;
log("发送", v);
socket.writeShort(10);
socket.writeInt(5);
socket.writeInt(v);
socket.flush();
}
}
}
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
public class Message {
public IoSession session;
public IoBuffer buff;
public int msglen=-1;
}
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class TestOne extends IoHandlerAdapter{
HashMap<IoSession, Message> map=new HashMap<IoSession, Message>();
@Override
public void messageReceived(IoSession session,Object message) throws Exception{
IoBuffer buff = (IoBuffer)message;
Message msg=map.get(session);
int p = msg.buff.position();
msg.buff.put(buff);
msg.buff.position(p);
read(msg);
}
public void read(Message msg){
int limit=msg.buff.limit()-msg.buff.position();
if(msg.msglen<0){
if(limit>=2){
msg.msglen=msg.buff.getShort();
System.out.println("消息长度"+msg.msglen);
read(msg);
}
}else if(limit>=(msg.msglen-2)){
int id = msg.buff.getInt();
System.out.println("解析消息"+id);
switch(id){
case 5:
int str = msg.buff.getInt();
Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<IoSession, Message> entry = iter.next();
Message val = (Message)entry.getValue();
System.out.println("发送到"+val.session.getId());
IoBuffer buff = IoBuffer.allocate(0);
buff.setAutoExpand(true);
buff.putShort((short)14);
buff.putInt(4);
buff.putInt((int)msg.session.getId());
buff.putInt(str);
buff.flip();
val.session.write(buff);
}
break;
case 2:
break;
case 3:
break;
}
msg.msglen=-1;
}
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("Session created...:"+session.getId());
//1:通知其它用户有人进入 2:告诉玩家的id并返回给所有用户信息
IoBuffer buff2 = IoBuffer.allocate(0);
buff2.setAutoExpand(true);//length,id=2,userid,arrlength,id
buff2.putShort((short)(10+4*map.size()));
buff2.putInt(2);
buff2.putInt((int)session.getId());
buff2.putInt(map.size());
Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<IoSession, Message> entry = iter.next();
Message val = (Message)entry.getValue();
System.out.println("发送到"+val.session.getId());
buff2.putInt((int)val.session.getId());
IoBuffer buff = IoBuffer.allocate(0);
buff.setAutoExpand(true);
buff.putShort((short)10);
buff.putInt(1);
buff.putInt((int)session.getId());
buff.flip();
val.session.write(buff);
}
buff2.flip();
session.write(buff2);
Message msg = new Message();
msg.session=session;
msg.buff=IoBuffer.allocate(0);
msg.buff.setAutoExpand(true);
map.put(session, msg);
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("Session closed...:"+session.getId());
map.remove(session);
//3: 通知其它用户有人移出
Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
@SuppressWarnings("rawtypes")
Map.Entry entry = iter.next();
Message val = (Message)entry.getValue();
IoBuffer buff = IoBuffer.allocate(0);
buff.setAutoExpand(true);
buff.putShort((short)10);
buff.putInt(3);
buff.putInt((int)session.getId());
buff.flip();
val.session.write(buff);
}
}
/**
* @param args
*/
public static void main(String[] args) throws IOException{
IoAcceptor acceptor = new NioSocketAcceptor();
//acceptor.getFilterChain().addLast("logger", new LoggingFilter());
//acceptor.getFilterChain().addLast(
// "codec",
// new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))
// );
acceptor.setHandler(new TestOne());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind(new InetSocketAddress(9123));
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
session.close(true);
}
}
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.net.Socket;
import flash.text.TextField;
/**
* ...
* @author lizhi http://game-develop.net/
*/
public class TestMina extends Sprite
{
private var socket:Socket;
private var msglen:int = -1;
private var tf:TextField;
public function TestMina()
{
tf = new TextField;
addChild(tf);
tf.autoSize = "left";
socket = new Socket("127.0.0.1", 9123);
socket.addEventListener(Event.CONNECT, socket_connect);
socket.addEventListener(ProgressEvent.SOCKET_DATA, socket_socketData);
}
private function socket_socketData(e:ProgressEvent):void
{
read();
}
private function read():void {
if (msglen<0) {
//log("读长度");
if (socket.bytesAvailable>=2) {
msglen = socket.readShort();
read();
}
}else if (socket.bytesAvailable >= (msglen-2)) {
//log("读消息体");
var id:int = socket.readInt();
//log("消息id id:" + id);
switch(id){
case 1://其它玩家进入
var userId:int = socket.readInt();
log(userId,"进入");
break;
case 2://告诉玩家id并返回其它用户信息
userId = socket.readInt();
log("进入成功 你的id是:", userId);
var len:int = socket.readInt();
var arr:Array = [];
while (len-->0) {
userId = socket.readInt();
arr.push(userId);
}
if (arr.length > 0) {
log("其它用户:",arr);
}
break;
case 3://有用户退出
userId = socket.readInt();
log(userId,"退出");
break;
case 4://用户发言
userId = socket.readInt();
var str:int = socket.readInt();
log(userId+"说:",str);
break;
}
msglen = -1;
}
}
private function log(...args):void {
tf.appendText(args + "\n");
}
private function socket_connect(e:Event):void
{
stage.addEventListener(MouseEvent.CLICK, stage_click);
}
private function stage_click(e:MouseEvent):void
{
var v:int = Math.random() * 10;
log("发送", v);
socket.writeShort(10);
socket.writeInt(5);
socket.writeInt(v);
socket.flush();
}
}
}
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
public class Message {
public IoSession session;
public IoBuffer buff;
public int msglen=-1;
}
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class TestOne extends IoHandlerAdapter{
HashMap<IoSession, Message> map=new HashMap<IoSession, Message>();
@Override
public void messageReceived(IoSession session,Object message) throws Exception{
IoBuffer buff = (IoBuffer)message;
Message msg=map.get(session);
int p = msg.buff.position();
msg.buff.put(buff);
msg.buff.position(p);
read(msg);
}
public void read(Message msg){
int limit=msg.buff.limit()-msg.buff.position();
if(msg.msglen<0){
if(limit>=2){
msg.msglen=msg.buff.getShort();
System.out.println("消息长度"+msg.msglen);
read(msg);
}
}else if(limit>=(msg.msglen-2)){
int id = msg.buff.getInt();
System.out.println("解析消息"+id);
switch(id){
case 5:
int str = msg.buff.getInt();
Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<IoSession, Message> entry = iter.next();
Message val = (Message)entry.getValue();
System.out.println("发送到"+val.session.getId());
IoBuffer buff = IoBuffer.allocate(0);
buff.setAutoExpand(true);
buff.putShort((short)14);
buff.putInt(4);
buff.putInt((int)msg.session.getId());
buff.putInt(str);
buff.flip();
val.session.write(buff);
}
break;
case 2:
break;
case 3:
break;
}
msg.msglen=-1;
}
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("Session created...:"+session.getId());
//1:通知其它用户有人进入 2:告诉玩家的id并返回给所有用户信息
IoBuffer buff2 = IoBuffer.allocate(0);
buff2.setAutoExpand(true);//length,id=2,userid,arrlength,id
buff2.putShort((short)(10+4*map.size()));
buff2.putInt(2);
buff2.putInt((int)session.getId());
buff2.putInt(map.size());
Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<IoSession, Message> entry = iter.next();
Message val = (Message)entry.getValue();
System.out.println("发送到"+val.session.getId());
buff2.putInt((int)val.session.getId());
IoBuffer buff = IoBuffer.allocate(0);
buff.setAutoExpand(true);
buff.putShort((short)10);
buff.putInt(1);
buff.putInt((int)session.getId());
buff.flip();
val.session.write(buff);
}
buff2.flip();
session.write(buff2);
Message msg = new Message();
msg.session=session;
msg.buff=IoBuffer.allocate(0);
msg.buff.setAutoExpand(true);
map.put(session, msg);
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("Session closed...:"+session.getId());
map.remove(session);
//3: 通知其它用户有人移出
Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
@SuppressWarnings("rawtypes")
Map.Entry entry = iter.next();
Message val = (Message)entry.getValue();
IoBuffer buff = IoBuffer.allocate(0);
buff.setAutoExpand(true);
buff.putShort((short)10);
buff.putInt(3);
buff.putInt((int)session.getId());
buff.flip();
val.session.write(buff);
}
}
/**
* @param args
*/
public static void main(String[] args) throws IOException{
IoAcceptor acceptor = new NioSocketAcceptor();
//acceptor.getFilterChain().addLast("logger", new LoggingFilter());
//acceptor.getFilterChain().addLast(
// "codec",
// new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))
// );
acceptor.setHandler(new TestOne());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind(new InetSocketAddress(9123));
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
session.close(true);
}
}
浙公网安备 33010602011771号