JAva nettyサービス側はクライアントに16進数データを送信し、クライアントは受信できない-解決済み
プロジェクトではnettyとC言語で接続する必要があり、双方は16進数でデータ転送を行う
このケースでは、JavaNettyでC Sokcetと文字列通信を行う方法、Javaサービス側、Cクライアントについて説明します.
ポイントヒント:ネットワーク通信はbyteバイトであり、両側の通信は必ず統一的に符号化し、文字化と受信できない問題をできるだけ避けなければならない.
1.ChildChannelInitializerを設定する.JAvaにおけるinitChannel(SocketChannel ch)
2.ServerHandler.JAvaでC言語クライアントからの16進文字列を受信
3.ConvertCodeを作成する.JAva:2でConvertCodeを使いました.receiveHexToString(bytes)とConvertCode.hexString2Bytes(receiveStr)
クライアントテストツールTCPUDP SocketデバッグツールV 2を使用しています.3グリーンフリー版
このケースでは、JavaNettyでC Sokcetと文字列通信を行う方法、Javaサービス側、Cクライアントについて説明します.
ポイントヒント:ネットワーク通信はbyteバイトであり、両側の通信は必ず統一的に符号化し、文字化と受信できない問題をできるだけ避けなければならない.
1.ChildChannelInitializerを設定する.JAvaにおけるinitChannel(SocketChannel ch)
public class ChildChannelInitializer extends ChannelInitializer {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
System.out.println("==================netty ==================");
System.out.println(" : ");
System.out.println("IP:" + ch.localAddress().getHostName());
System.out.println("Port:" + ch.localAddress().getPort());
System.out.println("==================netty ==================");
ChannelPipeline pipeline = ch.pipeline();
//
/*pipeline.addLast(new MsgEncoder());
pipeline.addLast(new MsgDecoder());*/
// /
pipeline.addLast("handler", serverHandler);
}
...
}
2.ServerHandler.JAvaでC言語クライアントからの16進文字列を受信
public class ServerHandler extends ChannelHandlerAdapter{
public void channelRead(ChannelHandlerContext channel, Object msg) throws Exception {
try {
ByteBuf buf = (ByteBuf)msg;
byte [] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);// bytes
String receiveStr = ConvertCode.receiveHexToString(bytes);// ,
// 16
writeToClient(receiveStr,channel," ");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
log.error(" :",e);
}
}
/**
*
* @param
* @param channel
* @param mark /log
*
//channel.writeAndFlush(msg);//
*
//channel.writeAndFlush(receiveStr.getBytes());//
*
netty , ByteBuf, , ByteBuf
*/
private void writeToClient(final String receiveStr, ChannelHandlerContext channel, final String mark) {
try {
ByteBuf bufff = Unpooled.buffer();//netty ByteBuf
bufff.writeBytes(ConvertCode.hexString2Bytes(receiveStr));// 16
channel.writeAndFlush(bufff).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
StringBuilder sb = new StringBuilder("");
if(!StringUtils.isEmpty(mark)){
sb.append("【").append(mark).append("】");
}
if (future.isSuccess()) {
System.out.println(sb.toString()+" "+receiveStr);
log.info(sb.toString()+" "+receiveStr);
} else {
System.out.println(sb.toString()+" "+receiveStr);
log.error(sb.toString()+" "+receiveStr);
}
}
});
} catch (Exception e) {
e.printStackTrace();
System.out.println(" writeToClient() "+e.getMessage());
log.error(" writeToClient() :",e);
}
}
...
}
3.ConvertCodeを作成する.JAva:2でConvertCodeを使いました.receiveHexToString(bytes)とConvertCode.hexString2Bytes(receiveStr)
package com.vk.updoc.netty2;
public class ConvertCode {
/**
* @Title:bytes2HexString
* @Description: 16
* @param b
*
* @return 16
* @throws
*/
public static String bytes2HexString(byte[] b) {
StringBuffer result = new StringBuffer();
String hex;
for (int i = 0; i < b.length; i++) {
hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
result.append(hex.toUpperCase());
}
return result.toString();
}
/**
* @Title:hexString2Bytes
* @Description:16
* @param src 16
* @return
*/
public static byte[] hexString2Bytes(String src) {
int l = src.length() / 2;
byte[] ret = new byte[l];
for (int i = 0; i < l; i++) {
ret[i] = (byte) Integer
.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
}
return ret;
}
/**
* @Title:string2HexString
* @Description: 16
* @param strPart
* @return 16
*/
public static String string2HexString(String strPart) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < strPart.length(); i++) {
int ch = (int) strPart.charAt(i);
String strHex = Integer.toHexString(ch);
hexString.append(strHex);
}
return hexString.toString();
}
/**
* @Title:hexString2String
* @Description:16
* @param src
* 16
* @return
* @throws
*/
public static String hexString2String(String src) {
String temp = "";
for (int i = 0; i < src.length() / 2; i++) {
//System.out.println(Integer.valueOf(src.substring(i * 2, i * 2 + 2),16).byteValue());
temp = temp+ (char)Integer.valueOf(src.substring(i * 2, i * 2 + 2),16).byteValue();
}
return temp;
}
/**
* @Title:char2Byte
* @Description: char-->integer-->byte
* @param src
* @return
* @throws
*/
public static Byte char2Byte(Character src) {
return Integer.valueOf((int)src).byteValue();
}
/**
* @Title:intToHexString
* @Description:10 16
* @param a
* @param len
* @return
* @throws
*/
public static String intToHexString(int a,int len){
len<<=1;
String hexString = Integer.toHexString(a);
int b = len -hexString.length();
if(b>0){
for(int i=0;i1
1 xor f7-->f6
f6 xor 0f-->f9
....
62 xor 84-->e6
, :e6
* @return
*/
public static String xor(String strHex_X,String strHex_Y){
// x、y
String anotherBinary=Integer.toBinaryString(Integer.valueOf(strHex_X,16));
String thisBinary=Integer.toBinaryString(Integer.valueOf(strHex_Y,16));
String result = "";
// 8 ,
if(anotherBinary.length() != 8){
for (int i = anotherBinary.length(); i <8; i++) {
anotherBinary = "0"+anotherBinary;
}
}
if(thisBinary.length() != 8){
for (int i = thisBinary.length(); i <8; i++) {
thisBinary = "0"+thisBinary;
}
}
//
for(int i=0;i"07dd"
* @param input
* @param size
* @param symbol symol '0'
* @return
* N_TimeCheck
*/
public static String fill(String input, int size, char symbol) {
while (input.length() < size) {
input = symbol + input;
}
return input;
}
public static void main(String args[]) {
String productNo = "3030303032383838";
System.out.println(hexString2String(productNo));
productNo = "04050103000001070302050304";
System.out.println(hexString2String(productNo));
}
// Java http://blog.csdn.net/acrambler/article/details/45743157
}
クライアントテストツールTCPUDP SocketデバッグツールV 2を使用しています.3グリーンフリー版