⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverthreadnio.java

📁 JAVA解析MSNP15协议
💻 JAVA
字号:
package jm.framework.msn.service;

import java.io.IOException;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

import jm.framework.msn.SystemManager;
import jm.framework.msn.msg.LoginMessage;
import jm.framework.msn.msg.group.MsgGroupFactory;
import jm.framework.msn.msg.group.UserGroupFactory;
import jm.framework.msn.protocol.out.OutVER;
import jm.framework.msn.usr.User;
import jm.framework.msn.util.Log;
import jm.util.JMRpcThread;

/**
 * 登录验证的线程 梦界家园MSNP15
 * 
 * @author ISHome
 * @since 0.5.0.1
 * @version 0.1
 */
public class ServerThreadNIO extends JMRpcThread {
	/** 服务器连接 */
	protected SocketChannel socket = null;
	protected MsgGroupFactory messageGroup = null;

	public static void main(String[] args) {
		try {
			UserGroupFactory userFactory = systemManager.getUserGroup();
			User loginer = new User();
			loginer.setLoginID("ishometest@live.cn");
			loginer.setPassWord("123456789");
			userFactory.setLoginer(loginer);
			ServerThreadNIO login = new ServerThreadNIO();
			login.login();
			login.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public ServerThreadNIO() {
		super();
		this.messageGroup = systemManager.getMessageGroup();
	}

	/**
	 * 开始登录
	 */
	public void login() {
		// 打开连接
		openConnection();
		messageGroup.addLoginMessage((new OutVER()).outVoker(null));
	}

	protected ByteBuffer inBuffeer = ByteBuffer.allocate(1024);
	
	/**
	 * 运行线程
	 */
	public void run() {
		try {
			// 开始线程
			while (true) {
				// 发送数据
				if (messageGroup.getLoginMessagesCount() > 0) {
					LoginMessage outMsg = messageGroup.getLoginMessage();
					Log.debug(">>> " + outMsg);
					if (outMsg != null) {
						socket.write(outMsg.toByteBuffers());
					}
				}
				Log.debug("    wait ... " );
				// 接收数据
				socket.read(inBuffeer);
//				while(socket.read(inBuffeer)!=-1){
//					sleep(200);
//				}
				
				// 处理返回
				inBuffeer.flip();// flip方法在读缓冲区字节操作之前调用。
				LoginMessage inMsg = new LoginMessage();
				if (inMsg.load(inBuffeer)) {
					Log.debug("<<< " + inMsg);
					LoginThread login = systemManager.getThreadGroup().getLoginThread(this);
					login.setInMsg(inMsg);
					login.start();
				}
				// 清空缓冲
				inBuffeer.clear();
				sleep(500);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			interrupt();
		}
	}

	/**
	 * 关闭线程
	 */
	public void interrupt() {
			// 关闭链接
			closeConnection();
		// 关闭线程
		super.interrupt();
	}

	protected static SystemManager systemManager = SystemManager.getInstance();

	/**
	 * 利用tcp/ip连接到server,生成输入输出流。基本编码为UTF-8。
	 */
	protected void openConnection(){
		try {
			closeConnection();
			SocketAddress serverAddress = systemManager.getServerAddress();
			Log.debug("server==>" + serverAddress);
			//// 打开套接字通道并将其连接到远程地址。
			this.socket = SocketChannel.open(serverAddress);
			this.socket.configureBlocking(false);
		} catch (Exception ex) {
			//关闭服务
			ex.printStackTrace();
			System.exit(0);
		}
	}

	/**
	 * 关闭连接
	 * 
	 * @throws IOException
	 */
	protected void closeConnection() {
		try {
			if (socket != null)
				socket.finishConnect();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -