实例的客户端面板如图所示:
客户端的布局:
1、 一个猜拳项目的文件:NIOClient
2、 新建Jframe窗体,叫ClientUI
3、 在窗体里添加面板等,按照如上图所示添加组件(所有的滚动窗格都是文本区域)
4、 请出拳中添加的三个按钮,删除文字,添加图片
将需要用的图片添加到源包下面的一个包里(直接从文件夹中拖拽过来即可)
选中button 在右边属性栏里找 icon 属性,选中图片后即可自动添加
客户端的协议:
1、 添加一个协议Protocol
2、 创建一个方法,报没有返回值的错,所以 再添加一个返回值为空
3、 先在协议里面定义几个变量
4、 下面开始实现协议内容
a) 创建一个随机生成数对象 报错就import
b) 下面就是选择判断了 选择分支语句
c) 补充里面的分支1(石头剪刀布 服务器出哪一个)
d) 分支2
e) 分支3
f) 返回值是answer,answer是一句话 在break的括弧外面 那个null就不要了
5、 回到服务端 Server 设计界面 双击 启动服务器按钮
6、 在跳转的界面的最上面 粘贴 报错 import
7、 回到启动服务器事件 按下变灰
8、 再加 先不抛异常 但是import
9、 继续 不try
10、 继续 不try 但是下面有个import
11、 连接完成之后 输出的一段话
12、 Try catch语句块 从第二个开始import 然后 删除catch的内容
13、 双击事件总体代码展示
14、 运行一下试试 点击启动服务器 有服务器开始侦听客户机连接就对了
选择器的轮询:还包含在上一个的catch下面
1、 new一个线程
2、 在新线程里面加个东西
3、 在上面的{}里添加内容 报错内容是删除catch字句 但是删除之后又回到第二步了 所以现在你先不删除
4、 放在try后的{里 都import之后 还有两个错误 doAccept什么的 先不管 下面再改
接下来:
定义处理连接的成员函数doAccept
定义数据交换的成员函数 doRead
1、 为了使用选择器管理 Channel, 我们需要将 Channel 注册到选择器中(目前不知道放在哪里)
listenChannel.register(selector, SelectionKey.OP_ACCEPT)
clientChannel.register(selector, SelectionKey.OP_READ,protocol)
2、 在上节课的start 后面添加程序 先不管异常 这是因为抛异常 但是没有异常 所以才报错
3、 加在上面的函数里 import一个 然后还会有个错误 先不管
4、 紧接着继续粘贴
5、 处理下那个错误 粘贴的位置错了 重新把整个函数粘贴在事件的外面 粘贴到start括号的外面 就没错了
6、 在刚才的成员函数下面再粘贴
7、 下面添加读的内容 在函数里面 有错 import
8、 定义字符集 import
9、 取出附加信息
10、 取出来之后,清空一次缓冲区再读
11、 指针回到起点 从起点开始 取出所有数据
12、 调用协议 计算回复的信息应该是什么
13、 协议回复的信息是这种类型的:serverSide+“#”+result;
14、 存好/读取信息 准备发送
15、 继续 接上面
16、 服务器端目前就算做完了 下面就可以打包:右击项目名称—打包为—仅图像(就是这个!!!你没看错!!!)
再右击项目名称—属性——查看项目文件的路径—进入这个文件夹路径—查看会多出一个dist文件夹就是了
运行这个打好的包
客户端的连接服务器按钮:
1、 ClientUI 双击 连接服务器按钮 但是先不做这些,还是要现在最上面粘贴一些定义 该import的import
2、 回到连接服务按钮 txtRemotePort报错的话 把它复制粘过去
3、 下面一块 粘过来的线import import之后抛异常 抛语句块 再然后 修改抛的异常 就没有错了
4、 让连接按钮不可用 连接服务器连接一次就可以了
5、 回到设计界面,另外的三个按钮剪刀石头布,出拳之后,玩家界面的图片得改,并且服务器出什么也会变。首先,双击石头
6、 先判断连没连上服务器
7、 先写try catch的括号 因为现在没有异常,所以报错,先不管
8、 下面的内容全都放在抛异常的try里面 先显示玩家出的图片,就是你点击了石头,所以这里应该是显示石头,import,但是catch还会报错,不管它
9、 再玩家出显示锤子
10、 紧接着 这里有了IO,下面的catch IO异常就不会再报错了
11、 上面是发,这里是收
12、 继续接着上面
13、 判断胜负
14、 更新标签
15、 剪刀和布,把石头的程序都复制过去,改下面圈出来的地方就可以了
16、 运行效果