📄 serverthreadnio.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 + -