---------------------------------(原创作品,请保留作者著作信息)--------------------------------------------

这些日子在公司开发一个基于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的握手)(基础篇转)相关推荐

  1. java与C语言之间socket通信(java客户端 C服务端)

    直接贴代码 服务端C代码 server.c #include <stdio.h> #include <sys/types.h> #include <sys/socket. ...

  2. java与c 通信_Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...

  3. Java修炼 之 基础篇(二)Java语言构成

    上次的博文中Java修炼 之 基础篇(一)Java语言特性我们介绍了一下Java语言的几个特性,今天我们介绍一下Java语言的构成. 所谓的Java构成,主要是指Java运行环境的组成,从外围到核心依 ...

  4. Java面试题基础篇(一)

    Java面试题基础篇(一) Java面试题基础篇(一) 1.jre和jdk有什么区别? 2.==与equals的区别? 3.接口和抽象类的共同点和不同点? 4.lamda表达式的优缺点? 5.Stri ...

  5. (原创) 脚踏实地学Java之:基础篇

    (原创)  脚踏实地学Java之:基础篇  最近与几个朋友闲聊技术,当谈起他们各自用JAVA做项目时所用到的技术时,夸夸其谈,不知所云,犹如布什总统竞选前的演讲一般精彩,听的我是云里雾里,一头雾水!但 ...

  6. 《Java工程师成神之路》深入理解Java核心技术(基础篇)

    学习目标: 深入理解Java核心技术(基础篇) 学习内容: 1.面向对象的五大基本原则 (1)单一职责原则:一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作. (2)开放封闭原则: ...

  7. 【Java练习题汇总】《第一行代码JAVA》面向对象基础篇,汇总Java练习题——面向对象:特性、类与对象、数组、String、内部类... ~

    Java练习题 · 面向对象基础篇 1️⃣ 面向对象基础篇 1️⃣ 面向对象基础篇 一.填空题 面向对象的三大特征:_______ ._______ ._______. 类由_______和_____ ...

  8. 一起学JAVA之【基础篇】4种默认线程池介绍

    一起学JAVA之[基础篇]4种默认线程池介绍 默认线程池创建方式 java.util.concurrent 提供了一个创建线程池的工具类Executors,里面有四种常用的线程池创建方法 public ...

  9. QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Soc ...

最新文章

  1. python - 字符串的格式化输出
  2. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
  3. 问题:Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder.
  4. Spark Streaming初步使用以及工作原理详解
  5. 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
  6. Java构造方法以及重载
  7. 第零课、开启ce自身保护、设置od,让调试不非法
  8. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户
  9. 云计算实战系列三(Linux文件管理)
  10. 2021年1月十大热门报告盘点(5天VIP会员免费送)
  11. pytorch保留比较高的epoch的权重
  12. WebStorm中配置node.js(Windows)
  13. indexOf 和 lastIndexOf 使用
  14. 微信小程序:使用普通链接二维码跳转到小程序,解析二维码携带参数(微信扫普通普通链接二维码和小程序里扫二维码解析参数方法)
  15. 什么是SEO?SEO的区别在哪里?
  16. 上海社保基数又上涨,对积分、落户有什么影响?
  17. 实验吧-天网管理系统 Writeup
  18. 樊登读书会极致读后感_【学习部落】樊登读书会可复制的领导力感悟
  19. 【案例】电影数据分析
  20. k8s(五):核心技术-Service

热门文章

  1. exec sql_EXEC SQL概述和示例
  2. 浅谈在基本数据包装类中使用'=='与equals的区别
  3. Python输入输出练习
  4. 对一个存储过程语法的解读
  5. 关于viewpager 里嵌套 listview 同时实现翻页功能的“java.lang.IllegalStateException: The specified child...异常处理...
  6. 地方命令SqlServer2008中解决在表上点右键把【编辑前200行】变成【编辑前10000行】的方法!...
  7. clean build 的区别(转)
  8. 路由器05---多拨
  9. angular2+typescript在asp.net MVC Web项目上的实现
  10. MeteoInfoLab脚本示例:MODIS Sinusoidal投影HDF数据