java的socket通信如何直接接收16进制数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的socket通信如何直接接收16进制数据相关的知识,希望对你有一定的参考价值。

由于处理数据时需要按照协议来处理,所以需要16进制数据,有写过接收到字符型然后转化为16进制,觉得有点麻烦,有没有办法直接接收16进制数据?

参考技术A 发送消息之前转码为16进制
Java code
public static final String encodeHex(String msg)
byte[] bytes = null;
try
bytes = msg.getBytes("GBK");
catch (java.io.UnsupportedEncodingException e)
e.printStackTrace();

StringBuffer buff = new StringBuffer(bytes.length * 4);
String b;
char a;
int n = 0;
int m = 0;
for (int i = 0; i < bytes.length; i++)
b = Integer.toHexString(bytes[i]);
if (bytes[i] > 0)
buff.append("00");
buff.append(b);
n = n + 1;
else
a = msg.charAt((i - n) / 2 + n);
m = a;
b = Integer.toHexString(m);
buff.append(b.substring(0, 4));
i = i + 1;


return buff.toString();
参考技术B public class Demo

public static void main(String[] args)
byte[] result = decodeHex("020D2B20202030303032311303");
for(byte b : result)
System.out.println(b);



public static byte[] decodeHex(String nm)
int len = nm.length();
byte[] result = new byte[len/2];
for(int i = 0; i<len; i++)
char c = nm.charAt(i);
byte b = Byte.decode("0x" + c);
c = nm.charAt(++i);
result[i/2] = (byte) (b << 4 | Byte.decode("0x" + c));

return result;

参考技术C 这么专业的问题可能很难有比较准确的答案吧

你这是死马当活马医啊追问

不需要准确答案,只需要粘贴一句接收16进制数据的代码就行,能用的话就给分

追答

16进制是什么东东 ~~~~(>_<)~~~~ 文科生你伤不起啊

追问

十进制知道不?就是逢十进一(0123456789)
十六进制一样的道理,逢16进一(0123456789abcdef)

追答

有点趣哦 为什么要产生16进制 直接 十进制 百进制 千进制 不是更好吗

追问

数据传输协议是16进制的,我需要根据协议来处理数据,否则很容易出现错误
而且..........哪里有白进制和千进制啊,,,,,你虽然是文科生也不能不知道这个吧

追答

我还真是不喜欢这个,数学已经超差啊,物理化学也是肉中刺,哎、、、、

参考技术D 传之前将16进制本转化为2进制收到再将2进制转化为16进制追问

额,另一端是一个电子器件,无法将16进制转化为2进制发送

追答

那能给你传过来字符串?

追问

我是用bufferedreader接收的时候直接转化了,网络上说
mBufferedReaderClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
这一句直接将接收到的数据转化为字符串,所以我才问有没有办法不转化

追答

socket都收到些啥?

追问

16进制是:
02 0D 2B 20 20 20 30 30 30 32 31 13 03(举例)
字符串是:
(电脑端)+ 00021
(安卓端)+ 00021 其他位显示为空格,可能是安卓字库的问题,不过没有多大关系
其中第三到第十二数据是变化的,和协议有关

第5个回答  2013-11-25 网络传输字符串类型。追问

什么意思?
我用调试工具传输16进制数据时,接收到的还是字符串
我的意思是直接接收16进制,不要转化为字符串

追答

网络传输函数给的就是字符串类型,这是给我们接口,没办法

Java Socket 通信之多线程

一、简单的客户端与服务器交互(客户端向服务器发送数据,服务器将数据再返回给客户端)

服务端

* 1、创建服务器 指定端口 ServerSocket(int port)
* 2、接收客户端连接 阻塞时
* 3、发送数据
* 接收多个客户端

Mulityserver.java

package cn.Tcp;
/*
 * 服务端
 * 1、创建服务器 指定端口   ServerSocket(int port)
 * 2、接收客户端连接   阻塞时
 * 3、发送数据
 * 接收多个客户端
 */
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Mulityserver 
    public static void main(String[] args) throws IOException 
        //1、创建服务器 指定端口   ServerSocket(int port)
        ServerSocket server=new ServerSocket(8488);
        //2、接收客户端连接   阻塞时
        while(true)   //死循环  一个accept() 一个客户端
            Socket socket=server.accept();
            System.out.println("一个客户端建立连接");
            //3、发送数据
            String msg="欢迎使用";
            //输出流
            
            DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
            dos.writeUTF(msg);
            dos.flush();
        
    

客户端

Client.java

package cn.Tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client 
    public static void main(String[] args) throws UnknownHostException, IOException 
        //1、创建客户端 必须指定服务器+端口 此时就在连接
        Socket client=new Socket("localhost",8488);
        //2、接收数据
        DataInputStream dis =new DataInputStream(client.getInputStream());
        String     echo=dis.readUTF();
        System.out.println(echo);
        
    

效果:

技术图片

二、多线程实现客户端与服务器端交互(客户端不断的发送,服务器不断的返回)

1)关闭流的方法

CloseUtil.java

package chatdemo02;

import java.io.Closeable;
import java.io.IOException;

/*
 * 关闭流的方法
 */
public class CloseUtil 
    public static void closeAll(Closeable... io) 
        for(Closeable temp:io) 
                try 
                    if(null!=temp) 
                    temp.close();
                 
                    catch (IOException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                
            
        
    

2)发送数据的线程

Send.java

package chatdemo02;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/*
 * 发送数据  线程 
 */
public class Send implements Runnable 
    //控制台输入流
    private BufferedReader console;
    //管道输出流
    private DataOutputStream dos;
    //控制线程
    private boolean isRunning=true;
    
    public Send() 
        console=new BufferedReader(new InputStreamReader(System.in));
        
    
    public Send(Socket client) 
        this();
        try 
            dos=new DataOutputStream(client.getOutputStream());
         catch (IOException e) 
            // TODO Auto-generated catch block
            isRunning=false;
            CloseUtil.closeAll(dos,console);
        
    
    
    private String getMsgFromConsole() 
        try 
            return console.readLine();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        return "";
    
/*
 * 1、从控制台接收数据
 * 2、发送数据
 */
    public void send() 
        String msg=getMsgFromConsole();
        if(null!=msg&&  !msg.equals("")) 
            try 
                dos.writeUTF(msg);
                dos.flush();   //强制刷新
             catch (IOException e) 
                // TODO Auto-generated catch block
                isRunning=false;
                CloseUtil.closeAll(dos,console);

            
        
    
    @Override
    public void run() 
        // 线程体
        while(isRunning) 
            send();
        
    

3)接收数据的线程

Receive.java

package chatdemo02;
/*
 * 接收线程
 */

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class Receive implements Runnable 
    //输入流
    private DataInputStream dis;
    //线程标识
    private boolean isRunning=true;
    
    public Receive() 
        
    

    public Receive(Socket client) 
        try 
            dis=new DataInputStream(client.getInputStream());
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
            isRunning=false;
            CloseUtil.closeAll(dis);
        
    
    
    /*
     * 接收数据
     */
    public String receive() 
        String msg="";
        try 
            msg=dis.readUTF();
            
         catch (IOException e) 
            //e.printStackTrace();
            isRunning=false;
            CloseUtil.closeAll(dis);
            
        
        return msg;
    

    @Override
    public void run() 
        //线程体
        while(isRunning) 
            System.out.println(receive());
        
    

4)服务端

Server.java

package chatdemo02;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 创建服务器
 * 写出数据 :输出流
 * 读取数据:输入流
 */
public class Server 
    public static void main(String[] args) throws IOException 
        ServerSocket server=new ServerSocket(9999);
        Socket client=server.accept();
        
        //写出数据
        //输入流
        DataInputStream dis=new DataInputStream(client.getInputStream());
        String msg=dis.readUTF();
        System.out.println(msg);
        
        //输出流    
        DataOutputStream dos=new DataOutputStream(client.getOutputStream());
        dos.writeUTF("服务器----->"+msg);
        dos.flush();
    

5)客户端

Client.java

package chatdemo02;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/*
 * 创建客户端  :发送数据+接收数据
 * 写出数据 :输出流
 * 读取数据:输入流
 * 输入流输出流在同一个线程内应该独立处理
 * 
 * 
 * 
 */
public class Client 
    public static void main(String[] args) throws UnknownHostException, IOException 
        Socket client=new Socket("localhost",9984);
        //控制台输入流
        new Thread(new Send(client)).start();   //一条路径
        new Thread(new Receive(client)).start(); 
        
    
    

运行 Server.java    Client.java   效果如下:

技术图片

 

以上是关于java的socket通信如何直接接收16进制数据的主要内容,如果未能解决你的问题,请参考以下文章

Java TCP socket通信,如何实现发送十六进制值,并在数据接收窗口中显示这些数据对应的字符串,非常感谢!

socket接收16进制速度比较快

java中使用socket编程 发送16进制数据,应该如何实现??

Java Socket通信之客户端程序 发送和接收数据

TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示

socket库:Python实现组播与发送二进制数据