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 其他位显示为空格,可能是安卓字库的问题,不过没有多大关系
其中第三到第十二数据是变化的,和协议有关
什么意思?
我用调试工具传输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通信,如何实现发送十六进制值,并在数据接收窗口中显示这些数据对应的字符串,非常感谢!
java中使用socket编程 发送16进制数据,应该如何实现??