`

跨语言之间的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的)是什么,然后才好利用各种解决方法来解决。

转自http://blog.csdn.net/xuanner/article/details/2029022

分享到:
评论

相关推荐

    基于Java--Socket-网络编程.doc

    Java提供了Swing和JavaFX等库来创建GUI,通过多线程技术,可以在后台进行Socket通信,不影响用户界面的响应。 3. **网络编程**:理解TCP/IP协议是Socket编程的基础。TCP是一种面向连接的、可靠的传输协议,它通过三...

    communication-based-on-JAVA.rar_即时通讯_即时通讯系统

    Java作为一种跨平台的编程语言,具有丰富的类库和强大的网络编程能力,这使得它成为构建分布式系统,如即时通讯系统的理想选择。Java的Socket编程接口和多线程特性能够轻松处理并发连接和数据传输,确保了即时通讯的...

    计算机网络课程设计---即时通信系统(Java实现)

    本项目采用Java语言进行实现,Java以其跨平台性和丰富的网络编程库,成为了开发此类系统的理想选择。下面将详细阐述这个即时通信系统的关键知识点。 1. **TCP协议**:TCP(Transmission Control Protocol)是传输层...

    PB-SOCKET开发

    PB的优势在于其高效、跨平台和语言无关性,支持C++, Java, Python等多种编程语言。通过定义.proto文件,我们可以声明数据结构,然后使用PB编译器生成相应的类或接口,方便在代码中操作和序列化/反序列化数据。 ...

    精选_基于JAVA和TCP SOCKET实现的P2P的局域网即时通信系统_源码打包

    在本项目中,"精选_基于JAVA和TCP SOCKET实现的P2P的局域网即时通信系统_源码打包" 提供了一个实现P2P(Peer-to-Peer)局域网即时通信系统的完整源码。这个系统利用了TCP/IP协议栈和Java编程语言,为用户提供了一种...

    易语言-Hp-Socket For E 5.4.2 高性能TCP/UDP通信组件 源码+模块+例程

    Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言...

    Android与易语言通过TCP实现通信

    在IT行业中,网络通信是应用程序之间交互的重要方式之一。在这个案例中,我们关注的是"Android与易语言通过TCP实现通信"。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信...

    Socket-tcpudp.rar_tcpudp

    这个"Socket编程"文件夹中可能包含了各种示例代码,比如简单的TCP服务器和客户端的实现,或者UDP广播和多播的示例,帮助理解如何在Java或其他编程语言中使用Socket API来实现TCP和UDP通信。 总之,Socket编程是网络...

    socket linux c & windows c# windows客户端,服务器程序和linux下客户端,服务器程序。一共四个经典程序并有详细的注释。细细的阅读,一定会有收获。

    Socket编程是网络编程的核心部分,它提供了一种标准的方式来创建通信端点,使得不同系统间的进程可以通过网络进行通信。在本资源中,包含了Linux C语言和Windows C#平台下的服务器和客户端程序,覆盖了TCP协议的实现...

    java网络通信(非常好的) 聊天

    Java作为一种强大的、跨平台的编程语言,提供了丰富的API和工具来实现网络通信。在这个"java网络通信(非常好的) 聊天"项目中,我们可以深入理解Java如何用于构建一个聊天系统。 1. **Java网络编程基础**: - ...

    Tcp服务端与客户端的JAVA实例源代码

    在IT领域,TCP(传输控制协议)和IP(网际协议)是网络通信的基础,而Java作为一种跨平台的开发语言,提供了丰富的API来实现TCP/IP通信。本篇将详细解析标题为“Tcp服务端与客户端的JAVA实例源代码”的相关知识点。 ...

    VB与javaSOCKE通讯

    通过学习和实践这个项目,开发者不仅可以掌握VB和Java之间的Socket通信,还能深入了解网络编程的基本原理,这对于开发跨平台的网络应用非常有帮助。同时,开放源代码的特性使得开发者可以直接参考和借鉴现有的实现,...

    java2源码(程序设计 包含 SWing以及Socket类)

    Java编程语言是面向对象的、跨平台的编程语言,它被广泛应用于企业级应用、桌面应用、移动应用等领域。在"java2源码(程序设计 包含 SWing以及Socket类)"这个资源中,我们可以深入学习Java的基础与进阶知识,特别是...

    Netty实现Java服务端和C#客户端联通

    同时,由于涉及到跨平台通信,对Java和C#两种语言的特性、API以及异常处理机制的熟悉也是必不可少的。 总的来说,Netty和DotNetty的结合使用为Java和C#之间提供了高效、可靠的网络通信方案。开发者需要掌握相关的...

    socket1.7z 源代码

    可以使用SSL/TLS协议为Socket通信添加加密层,防止数据被窃取或篡改。 7. **实际应用**:Socket广泛应用于各种网络服务,如Web服务器、邮件服务器、FTP服务器、聊天应用等。通过Socket,开发者可以构建自定义的网络...

    socket经典实例

    在不同的编程语言中,如C、C++、Java、Python等,都有对应的Socket API,虽然语法略有差异,但核心概念和工作原理是一致的。 通过学习和实践这些“Socket经典实例”,你可以掌握网络编程的基础,进一步提升自己的...

    Socket网络编程学习笔记.zip

    在Python、Java、C++等编程语言中,都有Socket库供开发者使用。通过Socket,我们可以创建服务器端程序来监听客户端的连接请求,也可以创建客户端程序来发起连接并发送数据。 在TCP Socket编程中,首先服务器端创建...

    JAVA网络通信系统的研究与开发(源代码++开题报告).rar

    Java网络通信系统是一种基于Java编程语言构建的网络应用程序,它允许不同设备间的高效、可靠的信息交换。本项目涉及的关键知识点主要包括以下几个方面: 1. **Java网络编程基础**:Java提供了丰富的API来支持网络...

    java服务器端(Netty_Proto)和c++客户端tcp通讯.rar

    ProtoBuf是一种数据序列化协议,它可以将结构化的数据序列化,可用于数据存储、通信协议等方面,支持多种编程语言,包括Java和C++。 描述中提到的“java服务器端(Netty_Proto)和c++客户端tcp通讯”进一步确认了这...

Global site tag (gtag.js) - Google Analytics