这些日子在公司开发一个基于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提供了Swing和JavaFX等库来创建GUI,通过多线程技术,可以在后台进行Socket通信,不影响用户界面的响应。 3. **网络编程**:理解TCP/IP协议是Socket编程的基础。TCP是一种面向连接的、可靠的传输协议,它通过三...
Java作为一种跨平台的编程语言,具有丰富的类库和强大的网络编程能力,这使得它成为构建分布式系统,如即时通讯系统的理想选择。Java的Socket编程接口和多线程特性能够轻松处理并发连接和数据传输,确保了即时通讯的...
本项目采用Java语言进行实现,Java以其跨平台性和丰富的网络编程库,成为了开发此类系统的理想选择。下面将详细阐述这个即时通信系统的关键知识点。 1. **TCP协议**:TCP(Transmission Control Protocol)是传输层...
PB的优势在于其高效、跨平台和语言无关性,支持C++, Java, Python等多种编程语言。通过定义.proto文件,我们可以声明数据结构,然后使用PB编译器生成相应的类或接口,方便在代码中操作和序列化/反序列化数据。 ...
在本项目中,"精选_基于JAVA和TCP SOCKET实现的P2P的局域网即时通信系统_源码打包" 提供了一个实现P2P(Peer-to-Peer)局域网即时通信系统的完整源码。这个系统利用了TCP/IP协议栈和Java编程语言,为用户提供了一种...
Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言...
在IT行业中,网络通信是应用程序之间交互的重要方式之一。在这个案例中,我们关注的是"Android与易语言通过TCP实现通信"。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信...
这个"Socket编程"文件夹中可能包含了各种示例代码,比如简单的TCP服务器和客户端的实现,或者UDP广播和多播的示例,帮助理解如何在Java或其他编程语言中使用Socket API来实现TCP和UDP通信。 总之,Socket编程是网络...
Socket编程是网络编程的核心部分,它提供了一种标准的方式来创建通信端点,使得不同系统间的进程可以通过网络进行通信。在本资源中,包含了Linux C语言和Windows C#平台下的服务器和客户端程序,覆盖了TCP协议的实现...
Java作为一种强大的、跨平台的编程语言,提供了丰富的API和工具来实现网络通信。在这个"java网络通信(非常好的) 聊天"项目中,我们可以深入理解Java如何用于构建一个聊天系统。 1. **Java网络编程基础**: - ...
在IT领域,TCP(传输控制协议)和IP(网际协议)是网络通信的基础,而Java作为一种跨平台的开发语言,提供了丰富的API来实现TCP/IP通信。本篇将详细解析标题为“Tcp服务端与客户端的JAVA实例源代码”的相关知识点。 ...
通过学习和实践这个项目,开发者不仅可以掌握VB和Java之间的Socket通信,还能深入了解网络编程的基本原理,这对于开发跨平台的网络应用非常有帮助。同时,开放源代码的特性使得开发者可以直接参考和借鉴现有的实现,...
Java编程语言是面向对象的、跨平台的编程语言,它被广泛应用于企业级应用、桌面应用、移动应用等领域。在"java2源码(程序设计 包含 SWing以及Socket类)"这个资源中,我们可以深入学习Java的基础与进阶知识,特别是...
同时,由于涉及到跨平台通信,对Java和C#两种语言的特性、API以及异常处理机制的熟悉也是必不可少的。 总的来说,Netty和DotNetty的结合使用为Java和C#之间提供了高效、可靠的网络通信方案。开发者需要掌握相关的...
可以使用SSL/TLS协议为Socket通信添加加密层,防止数据被窃取或篡改。 7. **实际应用**:Socket广泛应用于各种网络服务,如Web服务器、邮件服务器、FTP服务器、聊天应用等。通过Socket,开发者可以构建自定义的网络...
在不同的编程语言中,如C、C++、Java、Python等,都有对应的Socket API,虽然语法略有差异,但核心概念和工作原理是一致的。 通过学习和实践这些“Socket经典实例”,你可以掌握网络编程的基础,进一步提升自己的...
在Python、Java、C++等编程语言中,都有Socket库供开发者使用。通过Socket,我们可以创建服务器端程序来监听客户端的连接请求,也可以创建客户端程序来发起连接并发送数据。 在TCP Socket编程中,首先服务器端创建...
Java网络通信系统是一种基于Java编程语言构建的网络应用程序,它允许不同设备间的高效、可靠的信息交换。本项目涉及的关键知识点主要包括以下几个方面: 1. **Java网络编程基础**:Java提供了丰富的API来支持网络...
ProtoBuf是一种数据序列化协议,它可以将结构化的数据序列化,可用于数据存储、通信协议等方面,支持多种编程语言,包括Java和C++。 描述中提到的“java服务器端(Netty_Proto)和c++客户端tcp通讯”进一步确认了这...