跨语言之间的socket通信(C--Java的握手)(基础篇转)
---------------------------------(原创作品,请保留作者著作信息)--------------------------------------------
这些日子在公司开发一个基于B/S的服务器监控的, 服务器端是视频电话系统,是C语言UDP的WinSock建立的Socket监听,客户端我是用了JSP进行开发,开发环境是MyEclipse6.0+Tomcat5.5+jdk6.0,于是要用Java的UDP socket与WinSock进行握手谈话,嘻嘻,说得形象了点。首先开始谈话吧!!!!!!!!.................
(1)谈话开始,先讲下一点网络知识吧。
xuanner老师:socket握手后,双方通信的是什么东西呢?
学生:就是字节。
xuanner老师:那是什么字节?主机字节还是网络字节?
学生:网络字节。
xuanner老师:那解释下网络字节跟主机字节有什么区别?
学生:想了想说,就是高位在前跟在后的区别了,网络字节是低位在前,高位在后的,而主机字节是高位在前,低位在后。比如说在C语言声明一个int类型的值,它是四个字节保存的,它的前两个字节就是高位,后两个字节就是低位,有一种算法可以把它转为网络字节。(后面提供)
xuanner老师:好,不错!!那么 WinSock握手后发数据包时,Java Socket取得到后如何处理呢?
学生:得到数据包(字节数组)后,再把网络字节转为主机字节就可以了,有一种算法可以把它转为主机字节。(后面提供)
xuanner老师:对,还挺聪明的。但如果WinSock握手后发送的数据包含有字符呢,或是中文字符呢?该如何实现呢?
学生:想了又想,不知道怎么回答。回答不会。
xuanner老师:首先要了解C语言与Java语言数据类型的数据编码与存储格式,C语言字符是以系统默认GBK为编码格式,而Java语言字符是以JVM为编码格式。WinSock发送数据包是字符以ANSI存储格式发送的,到了Java Socket后,直接将其转换为String类型。
xuanner老师:那如果是Java Socket发送的数据包含有中文字符,如何打包?
学生:直接把String以GBK编码格式转换为bytes即可。
好啦,网络socket握手讲解完毕。
(2)数据类型编码算法
<1>Java 中int类型主机字节转换为网络字节算法[ 封包 ]
/** *//**
* 将int转为低字节在前,高字节在后的byte数组
*/
// 封包int算法
private static byte[] InttoByteArray(int n) ...{
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
b[2] = (byte) (n >> 16 & 0xff);
b[3] = (byte) (n >> 24 & 0xff);
return b;
}
<2>Java中short类型主机字节转换为网络字节算法[ 封包 ]
/** *//**
* 将short转为低字节在前,高字节在后的byte数组(网络字节)
*/
//封包short算法
private static byte[] ShorttoByteArray(short n) ...{
byte[] b = new byte[2];
b[1] = (byte) (n & 0xff);
b[0] = (byte) (n >> 8 & 0xff);
return b;
}
<3>Java 中int类型网络字节转换为主机字节算法[ 解包 ]
// 解包为int算法
private static int ByteArraytoInt(byte[] b) ...{
int iOutcome = 0;
byte bLoop;
for (int i = 0; i < 4; i++) ...{
bLoop = b[i];
iOutcome += (bLoop & 0xff) << (8 * i);
}
return iOutcome;
}
<4>Java 中short类型网络字节转换为主机字节算法[ 解包 ]
// 解包为short算法
privatestatic short ByteArraytoShort(byte[] b) ...{
short iOutcome = 0;
byte bLoop;
for (int i = 0; i < 2; i++) ...{
bLoop = b[i];
iOutcome += (bLoop & 0xff) << (8 * i);
}
return iOutcome;
}
<5>Java中ANSI字符数组转为String字符串[ 解包 ]
// 解包为String算法
private static String ByteArraytoString(byte[] b) ...{
// 转化为Unicode编码格式
String retStr = "";
try ...{
retStr = new String(b, "GBK"); //"GB2312"也可以
} catch (Exception e) ...{
}
return retStr.trim();
}
<6>Java中String字符串转换为ANSI字符数组[ 封包 ]
public byte[] StringtoByteArray(String str) ...{
byte[] retBytes = null;
try ...{
retBytes = str.getBytes("GBK"); //"GB2312"也可以
} catch(Exception ex) ...{}
return retBytes;
}
总结:解决java的字符编码问题首先需要明确的是你的问题中涉及到哪些编码,当前默认编码(不一定是系统的,而是JVM的)是什么,然后才好利用各种解决方法来解决。
希望我写这篇文章对你有帮助,My love CSDN 网友们。
csdn author: xuanner
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xuanner/archive/2008/01/07/2029022.aspx
跨语言之间的socket通信(C--Java的握手)(基础篇转)相关推荐
- java与C语言之间socket通信(java客户端 C服务端)
直接贴代码 服务端C代码 server.c #include <stdio.h> #include <sys/types.h> #include <sys/socket. ...
- java与c 通信_Java与C之间的socket通信
最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...
- Java修炼 之 基础篇(二)Java语言构成
上次的博文中Java修炼 之 基础篇(一)Java语言特性我们介绍了一下Java语言的几个特性,今天我们介绍一下Java语言的构成. 所谓的Java构成,主要是指Java运行环境的组成,从外围到核心依 ...
- Java面试题基础篇(一)
Java面试题基础篇(一) Java面试题基础篇(一) 1.jre和jdk有什么区别? 2.==与equals的区别? 3.接口和抽象类的共同点和不同点? 4.lamda表达式的优缺点? 5.Stri ...
- (原创) 脚踏实地学Java之:基础篇
(原创) 脚踏实地学Java之:基础篇 最近与几个朋友闲聊技术,当谈起他们各自用JAVA做项目时所用到的技术时,夸夸其谈,不知所云,犹如布什总统竞选前的演讲一般精彩,听的我是云里雾里,一头雾水!但 ...
- 《Java工程师成神之路》深入理解Java核心技术(基础篇)
学习目标: 深入理解Java核心技术(基础篇) 学习内容: 1.面向对象的五大基本原则 (1)单一职责原则:一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作. (2)开放封闭原则: ...
- 【Java练习题汇总】《第一行代码JAVA》面向对象基础篇,汇总Java练习题——面向对象:特性、类与对象、数组、String、内部类... ~
Java练习题 · 面向对象基础篇 1️⃣ 面向对象基础篇 1️⃣ 面向对象基础篇 一.填空题 面向对象的三大特征:_______ ._______ ._______. 类由_______和_____ ...
- 一起学JAVA之【基础篇】4种默认线程池介绍
一起学JAVA之[基础篇]4种默认线程池介绍 默认线程池创建方式 java.util.concurrent 提供了一个创建线程池的工具类Executors,里面有四种常用的线程池创建方法 public ...
- QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP? 2. Soc ...
最新文章
- python - 字符串的格式化输出
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
- 问题:Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder.
- Spark Streaming初步使用以及工作原理详解
- 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
- Java构造方法以及重载
- 第零课、开启ce自身保护、设置od,让调试不非法
- Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户
- 云计算实战系列三(Linux文件管理)
- 2021年1月十大热门报告盘点(5天VIP会员免费送)
- pytorch保留比较高的epoch的权重
- WebStorm中配置node.js(Windows)
- indexOf 和 lastIndexOf 使用
- 微信小程序:使用普通链接二维码跳转到小程序,解析二维码携带参数(微信扫普通普通链接二维码和小程序里扫二维码解析参数方法)
- 什么是SEO?SEO的区别在哪里?
- 上海社保基数又上涨,对积分、落户有什么影响?
- 实验吧-天网管理系统 Writeup
- 樊登读书会极致读后感_【学习部落】樊登读书会可复制的领导力感悟
- 【案例】电影数据分析
- k8s(五):核心技术-Service
热门文章
- exec sql_EXEC SQL概述和示例
- 浅谈在基本数据包装类中使用'=='与equals的区别
- Python输入输出练习
- 对一个存储过程语法的解读
- 关于viewpager 里嵌套 listview 同时实现翻页功能的“java.lang.IllegalStateException: The specified child...异常处理...
- 地方命令SqlServer2008中解决在表上点右键把【编辑前200行】变成【编辑前10000行】的方法!...
- clean build 的区别(转)
- 路由器05---多拨
- angular2+typescript在asp.net MVC Web项目上的实现
- MeteoInfoLab脚本示例:MODIS Sinusoidal投影HDF数据