📄 devicetcpservice.java~63~
字号:
package com.gps.center.dataservice;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.File;
import org.w3c.dom.NodeList;
import java.net.InetAddress;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.util.Set;
import java.util.Iterator;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.CharBuffer;
import java.nio.charset.CharsetDecoder;
import com.gps.center.baseclass.MsgObj;
import java.nio.channels.ClosedChannelException;
import com.gps.center.baseclass.ParseData;
public class DeviceTcpService extends ParseData implements Runnable {
private Selector sel = null;
private ServerSocketChannel TerminalTcpServer = null;
private SocketChannel socket = null;
private int centerPort;
private int MaxConnection;
private String centerIP = new String("localhost");
private String CodeType = "GB18030";
public static int sessions = 0;
public DeviceTcpService() {
readxml();
}
public synchronized void incsessions() {
sessions++;
}
public synchronized void reducesessions() {
sessions--;
}
public void run() {
initializeOperations();
//System.out.println("Abt to block on select()");
SelectionKey acceptKey = null; //选择方法每次创造选择器的注册表
try {
acceptKey = TerminalTcpServer.register(sel, SelectionKey.OP_ACCEPT); //记录渠道给选择器返回选择
} catch (ClosedChannelException ex) {
ex.printStackTrace();
}
try {
while (acceptKey.selector().select() > 0) { //返回一组钥匙给相应的I/O操作通道
Set readyKeys = sel.selectedKeys(); //返回这个选择器的设置
Iterator it = readyKeys.iterator(); //列表存储
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
it.remove();
if (key.isAcceptable()) { //如果key's channel允许新的socket连接
//System.out.println("Key is Acceptable");
ServerSocketChannel ssc = (ServerSocketChannel) key.
channel(); //Returns the channel for which this key was created.
socket = (SocketChannel) ssc.accept(); //Accepts a connection made to this channel's socket.
incsessions();
if (sessions > MaxConnection) {
break;
}
socket.configureBlocking(false); //调整this channel's 模块化形式
SelectionKey another = socket.register(sel,
SelectionKey.OP_READ | SelectionKey.OP_WRITE); //记录 this channel with the given 选择器,
}
if (key.isReadable()) { //如果this channel's 准备好读取信息
//System.out.println("key.isReadable");
String ret = readMessage(key);
if (ret != null) {
if (ret.length() > 1) {
//System.out.println(ret.length());
MsgObj msg = new MsgObj();
msg.cMsgType = TCPMSG;
msg.cMsg = ret;
System.out.println("TCP接收到的消息:"+msg.cMsg);
msg.cSelectionKey = key;
super.addRecieveMsg(msg);
}
}
}
}
}
} catch (Exception ex1) {
System.out.println("Inside initialization");
}
}
public void initializeOperations() { //初始化操作台
System.out.println("Inside initialization");
try {
sel = Selector.open();
TerminalTcpServer = TerminalTcpServer.open();
TerminalTcpServer.configureBlocking(false); //调整channel's设计模块
InetAddress ia = InetAddress.getLocalHost(); //获得主机IP
//System.out.println(ia);
InetSocketAddress isa = new InetSocketAddress(ia, centerPort); //创建SOCKET地址
TerminalTcpServer.socket().bind(isa); //重新获得并且封装SOCKET通过信道
//System.out.println("TCP use InetAddress" + ia.toString());
} catch (IOException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
private String readMessage(SelectionKey key) throws IOException {
int nBytes = 0;
String result = null;
socket = (SocketChannel) key.channel();
ByteBuffer buf = ByteBuffer.allocate(512);
try {
nBytes = socket.read(buf);
if (nBytes == -1) {
socket.close();
key.cancel();
reducesessions();
System.out.println("close socket");
}
buf.flip();
//Charset charset = Charset.forName("GB18030");
Charset charset = Charset.forName(CodeType);
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(buf);
result = new String(charBuffer.toString().trim());
//System.out.println(result+"接收的信息");
//System.out.println(buf.toString() + "12345");
} catch (IOException e) {
socket.close();
key.cancel();
reducesessions();
}
return result;
}
private void readxml() {
String strport, strmax;
try {
File f = new File("CenterInfo.xml");
if (f.exists()) {
//创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.
newInstance();
//创建解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//解析文件创建Document对象
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("Center");
for (int i = 0; i < nl.getLength(); i++) {
/* centerIP = (doc.getElementsByTagName("CenterIP").item(i).
getFirstChild().getNodeValue()).trim();*/
strport = (doc.getElementsByTagName("CenterPort").item(i).
getFirstChild().getNodeValue()).trim();
strmax = (doc.getElementsByTagName("MaxConnection").item(i).
getFirstChild().getNodeValue()).trim();
/* CodeType = (doc.getElementsByTagName("CodeType").item(i).
getFirstChild().getNodeValue()).trim();*/
super.centerPort = strport;
super.centerIp = centerIP;
try {
if (strport.length() > 0) {
centerPort = Integer.parseInt(strport);
System.out.println("centerPort:" + centerPort);
} else {
System.out.println("terminalport err");
System.exit( -1);
}
if (strmax.length() > 0) {
MaxConnection = Integer.parseInt(strmax);
} else {
System.out.println("MaxConnection err");
System.exit( -1);
}
} catch (Exception e) {
System.out.println("centerPort and MaxConnection err");
}
}
} else {
System.out.println("no find file: centerInfo.xml");
System.exit( -1);
}
} catch (Exception e) {
e.printStackTrace();
System.exit( -1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -