先介绍一下项目需求,主要是服务器接受客服端(电子柜台)传来的心跳信息,服务器也能主动发送信息给客户端
最近看了很多帖子,大多是服务器接受信息,然后被动回应客服端,这里我简单的做了一个管理客户的列表。用于指定发送
(当然就是本地操作成功,还未完全测试,应该还是存在很多Bug,仅供参考!!)
先说说Nio,这里就直接贴大神的链接啦:https://gitbook.cn/books/5b1792ad26a49a55324e782c/index.html
还有就是这里这套学校管理老师的比喻,就很形象,比较适合我这种菜鸟理解:https://www.cnblogs.com/wcyBlog/p/4716676.html
然后就是代码了!!!!!
服务器代码如下:
package com.js.archive.tcp;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.util.HashMap;
import java.util.Iterator;
public class TcpServer {
//缓冲区长度
private static final int BUF_SIZE = 28000;
//select 方法等待星道准备好的最长时间
private static final int timeout = 3000;
public static Selector selector;
/**
* 发送消息的开关
*/
public static boolean signal = false;
/**
* 发送消息的内容
*/
public static String message= "";
public static void main(String[] args) throws IOException {
init("192.168.0.166",1006);
new ServerWriteThread();
tcpServer();
}
public static void init(String hostname,Integer port) throws IOException {
if (selector == null) {
synchronized (TcpServer.class) {
if (selector == null) {
//创建一个选择器
selector = Selector.open();
//实例化一个信道
ServerSocketChannel socketChannel = ServerSocketChannel.open();
//将该信道绑定到指定端口
InetSocketAddress inetSocketAddress = new InetSocketAddress(hostname, port);
socketChannel .bind(inetSocketAddress);
System