JAva nettyサービス側はクライアントに16進数データを送信し、クライアントは受信できない-解決済み


プロジェクトではnettyとC言語で接続する必要があり、双方は16進数でデータ転送を行う
 
このケースでは、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グリーンフリー版