SocketChannel客户端程序编写

最近我在做一个读卡器项目,采用的是java语言开发。出现了一点问题,请大家帮我看一下。
需求:1.采用的事socket通信。厂家说在通信过程中需要有一个监听器监听缓冲区有数据,就接收数据,分析数据, 进行下次接收。
2发送登录命令 :AC 02 00 08 00 21 40 23 23 CD CE 0D ED。
3.登录成功后,读卡器会每隔五秒发送一次正常心跳。而我的程序需要发送确认收到心跳的命令:AC 10 DA 00 00 00,
4.但同时,如果有人刷卡,读卡器会发送卡信息给程序。也需要确认。如果卡信息不确认会丢失。
厂家给的测试程序采用的是C#开发,这一块实现原理首先是接收数据,如果接收到数据,就中断连接,分析数据,看数据是正常连接心跳,还是卡事件心跳,然后向读卡器发送确认指令AC 10 DA 00 00 00,分析完之后才可以进行下次数据接收。
我的程序是这样写的,总是获取不到卡号。实时的获取不到卡号。我写的一个测试程序。
最后我确认以后是SocketChannel编程。但是我真不知道如何实现我的业务需求,所以从网上找了代码,改了一下,但是达不到我的业务需求,请帮我看一下。

以下是我写的代码:帮忙看一下,谢谢了 :)
客户端类:
package nio[color=#800000];[/color]

import java.net.InetSocketAddress[color=#800000];[/color]
import java.nio.ByteBuffer[color=#800000];[/color]
import java.nio.channels.SelectionKey[color=#800000];[/color]
import java.nio.channels.Selector[color=#800000];[/color]
import java.nio.channels.SocketChannel[color=#800000];[/color]
[color=#008000]/**
* 客户端程序
* @author Administrator
*
*/[/color]

[color=#0000FF]public[/color] [color=#0000FF]class[/color] TCPClinet [color=#800000]{[/color]
[color=#0000FF]private[/color] Selector selector[color=#800000];[/color]

SocketChannel channel[color=#800000];[/color]

[color=#0000FF]private[/color] String ip[color=#800000];[/color]
[color=#0000FF]private[/color] [color=#0000FF]int[/color] port[color=#800000];[/color]

[color=#0000FF]public[/color] TCPClinet[color=#800000]([/color]String ip[color=#800000],[/color][color=#0000FF]int[/color] port[color=#800000])[/color] throws Exception[color=#800000]{[/color]
[color=#0000FF]this[/color].ip [color=#800000]=[/color] ip[color=#800000];[/color]
[color=#0000FF]this[/color].port [color=#800000]=[/color] port[color=#800000];[/color]
[color=#008000]//sendCmd();
[/color] init[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]

[color=#0000FF]public[/color] [color=#0000FF]void[/color] init[color=#800000]([/color][color=#800000])[/color] throws Exception[color=#800000]{[/color]
channel [color=#800000]=[/color] SocketChannel.open[color=#800000]([/color][color=#0000FF]new[/color] InetSocketAddress[color=#800000]([/color]ip[color=#800000],[/color] port[color=#800000])[/color][color=#800000])[/color][color=#800000];[/color]
channel.configureBlocking[color=#800000]([/color][b][color=#0000FF]false[/color][/b][color=#800000])[/color][color=#800000];[/color]

selector [color=#800000]=[/color] Selector.open[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
channel.[b][color=#0000FF]register[/color][/b][color=#800000]([/color]selector[color=#800000],[/color] SelectionKey.OP_READ[color=#800000])[/color][color=#800000];[/color]
[color=#0000FF]new[/color] TCPClientReadThread[color=#800000]([/color]selector[color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]
[color=#008000]/**
* 发送byte[]数组到读卡器
* @throws Exception
*/[/color]
[color=#0000FF]public[/color] [color=#0000FF]void[/color] sendCmd[color=#800000]([/color][color=#800000])[/color] throws Exception[color=#800000]{[/color]
[b][color=#0000FF]int[/color][/b][color=#800000][/color]color=#800000]][/color] cmd [color=#800000]=[/color] [color=#800000]{[/color][color=#800080]0xAC[/color], [color=#800080]0x02[/color], [color=#800080]0x00[/color], [color=#800080]0x08[/color], [color=#800080]0x00[/color], [color=#800080]0x21[/color], [color=#800080]0x40[/color], [color=#800080]0x23[/color], [color=#800080]0x23[/color],
[color=#800080]0xCD[/color], [color=#800080]0xCE[/color], [color=#800080]0x0D[/color], [color=#800080]0xED[/color], [color=#800080]0xAC[/color], [color=#800080]0x01[/color], [color=#800080]0x00[/color], [color=#800080]0x00[/color], [color=#800080]0x00[/color] [color=#800000]}[/color][color=#800000];[/color]

byte[color=#800000][/color]color=#800000]][/color] b [color=#800000]=[/color] [color=#0000FF]new[/color] byte[color=#800000][/color]md.length[color=#800000]][/color][color=#800000];[/color]
[b][color=#0000FF]for[/color][/b][color=#800000]([/color][color=#0000FF]int[/color] i [color=#800000]=[/color] [color=#800080]0[/color];i[color=#800000]<[/color] b.length[color=#800000];[/color]i[color=#800000]+[/color][color=#800000]+[/color][color=#800000])[/color][color=#800000]{[/color]
b[color=#800000][[/color]i[color=#800000]][/color] [color=#800000]=[/color] [color=#800000]([/color]byte[color=#800000])[/color]cmd[color=#800000][[/color]i[color=#800000]][/color][color=#800000];[/color]
[color=#800000]}[/color]
ByteBuffer buffer [color=#800000]=[/color] ByteBuffer.allocate[color=#800000]([/color][color=#800080]1024[/color])[color=#800000];[/color]
channel.write[color=#800000]([/color]buffer[color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]
[color=#0000FF]public[/color] [color=#0000FF]static[/color] [color=#0000FF]void[/color] main[color=#800000]([/color]String[color=#800000][[/color][color=#800000]][/color] args[color=#800000])[/color] [color=#800000]{[/color]
[color=#0000FF]try[/color] [color=#800000]{[/color]
TCPClinet tcp [color=#800000]=[/color] [color=#0000FF]new[/color] TCPClinet[color=#800000]([/color][color=#FF0000]"192.168.14.243"[/color][color=#800000],[/color] [color=#800080]6655[/color])[color=#800000];[/color]
tcp.sendCmd[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color] [color=#0000FF]catch[/color] [color=#800000]([/color]Exception e[color=#800000])[/color] [color=#800000]{[/color]
[color=#008000]// TODO Auto-generated catch block
[/color] e.printStackTrace[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]
[color=#800000]}[/color]
[color=#800000]}[/color]


客户端线程类:

package nio[color=#800000];[/color]

import java.io.IOException[color=#800000];[/color]
import java.nio.ByteBuffer[color=#800000];[/color]
import java.nio.channels.SelectionKey[color=#800000];[/color]
import java.nio.channels.Selector[color=#800000];[/color]
import java.nio.channels.SocketChannel[color=#800000];[/color]
import java.util.Iterator[color=#800000];[/color]
import java.util.Set[color=#800000];[/color]

[color=#0000FF]public[/color] [color=#0000FF]class[/color] TCPClientReadThread implements Runnable [color=#800000]{[/color]
[color=#008000]// 监听器,如果缓冲区有数据,通知程序接收
[/color] [color=#0000FF]private[/color] Selector selector[color=#800000];[/color]

[color=#0000FF]public[/color] TCPClientReadThread[color=#800000]([/color]Selector selector[color=#800000])[/color] [color=#800000]{[/color]
[color=#0000FF]this[/color].selector [color=#800000]=[/color] selector[color=#800000];[/color]
[color=#0000FF]new[/color] Thread[color=#800000]([/color][b][color=#0000FF]this[/color][/b][color=#800000])[/color].start[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]

@Override
[color=#0000FF]public[/color] [color=#0000FF]void[/color] run[color=#800000]([/color][color=#800000])[/color] [color=#800000]{[/color]
[color=#0000FF]try[/color] [color=#800000]{[/color]
[color=#0000FF]while[/color] [color=#800000]([/color]selector.select[color=#800000]([/color][color=#800000])[/color] [color=#800000]>[/color] [color=#800080]0[/color]) [color=#800000]{[/color]
Set[color=#800000]<[/color]SelectionKey[color=#800000]>[/color] keys [color=#800000]=[/color] selector.selectedKeys[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
Iterator[color=#800000]<[/color]SelectionKey[color=#800000]>[/color] iter [color=#800000]=[/color] keys.iterator[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#0000FF]while[/color] [color=#800000]([/color]iter.hasNext[color=#800000]([/color][color=#800000])[/color][color=#800000])[/color] [color=#800000]{[/color]
SelectionKey key [color=#800000]=[/color] [color=#800000]([/color]SelectionKey[color=#800000])[/color] iter.next[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
iter.remove[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
System.out.println[color=#800000]([/color]selector.keys[color=#800000]([/color][color=#800000])[/color].size[color=#800000]([/color][color=#800000])[/color][color=#800000])[/color][color=#800000];[/color]

[color=#0000FF]if[/color] [color=#800000]([/color]key.isReadable[color=#800000]([/color][color=#800000])[/color][color=#800000])[/color] [color=#800000]{[/color]
SocketChannel socketChannel [color=#800000]=[/color] [color=#800000]([/color]SocketChannel[color=#800000])[/color] key
.channel[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
ByteBuffer buffer [color=#800000]=[/color] ByteBuffer.allocate[color=#800000]([/color][color=#800080]1024[/color])[color=#800000];[/color]
[color=#0000FF]int[/color] byteRead [color=#800000]=[/color] socketChannel.read[color=#800000]([/color]buffer[color=#800000])[/color][color=#800000];[/color]
buffer.clear[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#0000FF]if[/color] [color=#800000]([/color]byteRead [color=#800000]=[/color][color=#800000]=[/color] [color=#800000]-[/color][color=#800080]1[/color]) [color=#800000]{[/color]
socketChannel.close[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color] [color=#0000FF]else[/color] [color=#800000]{[/color]
buffer.flip[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
byte[color=#800000][[/color][color=#800000]][/color] content [color=#800000]=[/color] [color=#0000FF]new[/color] byte[color=#800000][[/color]buffer.limit[color=#800000]([/color][color=#800000])[/color][color=#800000]][/color][color=#800000];[/color]
[color=#008000]// 从ByteBuffer中读取数据到byte数组中
[/color] buffer.get[color=#800000]([/color]content[color=#800000])[/color][color=#800000];[/color]

String receivedString [color=#800000]=[/color] btyetoString[color=#800000]([/color]content[color=#800000])[/color][color=#800000];[/color]
[color=#008000]// String receivedString =
[/color] [color=#008000]// Charset.forName("UTF-16").newDecoder().decode(buffer).toString();
[/color] System.out.println[color=#800000]([/color][color=#FF0000]"接收到来自服务器"[/color]
[color=#800000]+[/color] socketChannel.socket[color=#800000]([/color][color=#800000])[/color]
.getRemoteSocketAddress[color=#800000]([/color][color=#800000])[/color] [color=#800000]+[/color] [color=#FF0000]"的信息:"[/color]
[color=#800000]+[/color] receivedString[color=#800000])[/color][color=#800000];[/color]
[color=#008000]// 发送确认命令给服务器
[/color] [b][color=#0000FF]int[/color][/b][color=#800000][[/color][color=#800000]][/color] cmds [color=#800000]=[/color] [color=#800000]{[/color] [color=#800080]0xAC[/color], [color=#800080]0x10[/color], [color=#800080]0xDA[/color], [color=#800080]0x00[/color], [color=#800080]0x00[/color] [color=#800000]}[/color][color=#800000];[/color]

byte[color=#800000][[/color][color=#800000]][/color] bb [color=#800000]=[/color] [color=#0000FF]new[/color] byte[color=#800000][[/color]cmds.length[color=#800000]][/color][color=#800000];[/color]
[color=#0000FF]for[/color] [color=#800000]([/color][color=#0000FF]int[/color] i [color=#800000]=[/color] [color=#800080]0[/color]; i [color=#800000]<[/color] bb.length[color=#800000];[/color] i[color=#800000]+[/color][color=#800000]+[/color][color=#800000])[/color] [color=#800000]{[/color]
bb[color=#800000][[/color]i[color=#800000]][/color] [color=#800000]=[/color] [color=#800000]([/color]byte[color=#800000])[/color] cmds[color=#800000][[/color]i[color=#800000]][/color][color=#800000];[/color]
[color=#800000]}[/color]
[color=#008000]// buffer.get(bb);
[/color] socketChannel.write[color=#800000]([/color]buffer[color=#800000])[/color][color=#800000];[/color]
key.interestOps[color=#800000]([/color]SelectionKey.OP_READ
[color=#800000]|[/color] SelectionKey.OP_WRITE[color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]

[color=#800000]}[/color]
[color=#800000]}[/color]
[color=#800000]}[/color]
[color=#800000]}[/color] [color=#0000FF]catch[/color] [color=#800000]([/color]IOException e[color=#800000])[/color] [color=#800000]{[/color]
[color=#008000]// TODO Auto-generated catch block
[/color] e.printStackTrace[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]

[color=#800000]}[/color]

[color=#0000FF]public[/color] [color=#0000FF]static[/color] final String btyetoString[color=#800000]([/color]byte[color=#800000][[/color][color=#800000]][/color] bArray[color=#800000])[/color] [color=#800000]{[/color]
StringBuffer sb [color=#800000]=[/color] [color=#0000FF]new[/color] StringBuffer[color=#800000]([/color]bArray.length[color=#800000])[/color][color=#800000];[/color]
String sTemp[color=#800000];[/color]
[color=#0000FF]for[/color] [color=#800000]([/color][color=#0000FF]int[/color] i [color=#800000]=[/color] [color=#800080]0[/color]; i [color=#800000]<[/color] bArray.length[color=#800000];[/color] i[color=#800000]+[/color][color=#800000]+[/color][color=#800000])[/color] [color=#800000]{[/color]
sTemp [color=#800000]=[/color] Integer.toHexString[color=#800000]([/color][color=#800080]0xFF[/color] [color=#800000]&[/color] bArray[color=#800000][[/color]i[color=#800000]][/color][color=#800000])[/color][color=#800000];[/color]
[color=#0000FF]if[/color] [color=#800000]([/color]sTemp.length[color=#800000]([/color][color=#800000])[/color] [color=#800000]=[/color][color=#800000]=[/color] [color=#800080]1[/color]) [color=#800000]{[/color]
sb.append[color=#800000]([/color][color=#800080]0[/color])[color=#800000];[/color]

[color=#800000]}[/color]
sb.append[color=#800000]([/color]sTemp.toUpperCase[color=#800000]([/color][color=#800000])[/color][color=#800000])[/color][color=#800000];[/color]
sb.append[color=#800000]([/color][color=#FF0000]" "[/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]
[color=#0000FF]return[/color] sb.toString[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color]

[color=#800000]}[/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值