`
mengdejun
  • 浏览: 408709 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)

    博客分类:
  • Jav
阅读更多

代码:

http://files.cnblogs.com/kenkofox/Client-CPlusPlus.rar
http://files.cnblogs.com/kenkofox/Server_Java.rar

 

java和C++使用Socket通信,其实底层Socket都是相通的,所以只需要按照各自的语法去做就是了。

 

java服务器端使用ServerSocket的accept创建Socket,跟普通java之间的通信一致。

C++客户端使用makeConnect(server, port, "tcp"),send,recv等函数。

 

自己在这次编程中,首先遇到的是虽然连接成功了,但java无法接收C++发来的消息。

可能是用错函数之类的,后边改为下边的代码接收就没事了。

 

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->1 1 //接受数据,但不允许有中文,因为会乱码 2  2 DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 3  3 byte[] buffer = new byte[10000]; //缓冲区的大小 4  4 in.read(buffer); //处理接收到的报文,转换成字符串 5  5 /** 6 6 * C++传递过来的中文字,需要转化一下。C++默认使用GBK。 7 7 * GB2312是GBK的子集,只有简体中文。因为数据库用GB2312,所以这里直接转为GB2312 8 8 * */ 9  9 message = new String(buffer,"GB2312").trim();

 

 

 

另外

最大的问题是字符的编码问题,如果发现java接收到的字符串是乱码,就要仔细看看接下来的说明了。

 

Java代码在运行时,默认用UTF8来处理字符串,Socket发送字符串(如果用高层输出流直接输出String的话,最后还是自动用UTF8方式把字符串拆分成byte数组再传输的。(可以见http://www.cnblogs.com/kenkofox/archive/2010/04/23/1719009.html

而C++在xp运行的时候默认使用GBK来传输Socket。

 

所以java接收到C++消息的时候,应该转为GBK或者GB2312,才能显示正确中文。

而C++要接收到正确的java消息,就要在java发送的时候转为GBK或者GB2312编码(因为C++转码比java麻烦很多嘛,哈哈)

 

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->1 byte[] responseBuffer = newClientRequestHandler(message).response().getBytes("GB2312"); 2 out.write(responseBuffer, 0,responseBuffer.length);

 

 

而C++接收方面,只需要用buf装起来,然后转为string就是了。正确显示……代码大概是:

charCount = recv(socket, buf, len, 0);

string resultString(buf);

 

另外为了更好理解上述的编码问题,大家在java端发送信息到C++端的时候,试试下边的方式试试,很有意思的。记得要在C++那边关注charCount  

 

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->1 //获得输出输出流 2 out = newPrintStream(clientSocket.getOutputStream()); 3  out.print(test);//直接UTF8输出,最终底层每个中文用3个字节传输 4  out.print(newString(test.getBytes(),"GBK"));//转GBK失败,实际每个中文字用了4到5个字节传递 5  out.print(newString(test.getBytes("GBK"),"GBK"));//转GBK,但底层还是要拆成字节数组,当然最终还是跟UTF8一样

 

 

 

 

接下来是完整的代码说明

java方面:

EchoServerThread是一个Server类,专门等待客户的连接,然后建立EchoThread进行处理。

EchoThread是一个处理消息的线程,主要包括接收消息和发送消息的socket操作。

ClientRequestHandler是处理字符串的实际业务逻辑类……

 

C++方面:

client.cpp是测试的主函数。 

SocketManager.h包含SocketManager类,简单封装了Socket的启动和发送等操作。

connection.h包含Connection类,封装了Socket的底层调用。

conn_exception.h定义了一个异常。

分享到:
评论

相关推荐

    QT中使用C++ socket通信 客户端与服务端的代码实例

    总结,QT中的C++ Socket通信涉及创建服务器和客户端,设置连接,发送和接收数据,以及错误处理。通过`QTcpServer`和`QTcpSocket`类,开发者可以轻松构建稳定且功能丰富的网络应用程序。在实际项目中,还可以结合多...

    Java c++ socket通信

    Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景。Socket是计算机网络中的一个通信协议,它允许不同操作系统上的应用程序之间建立连接并交换数据。在这个场景中,Java作为客户端,C++作为服务端,两者...

    java c++ 通信之间的乱码解决方法

    Java和C++之间进行Socket通信时,可能会遇到乱码问题,主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C++在Windows XP环境下可能使用GBK编码。解决这个问题的关键在于确保数据在传输过程中保持正确的...

    c++ socket编程实例(服务端及客户端)

    本实例提供了C++实现的服务端(server.cpp)和客户端(client.cpp),让我们深入探讨这个主题。 首先,C++中的Socket编程通常涉及两个主要部分:服务器端和客户端。服务器端负责监听特定的端口,等待客户端连接,并处理...

    C++写的服务器与Java写的客户端通过Socket通信C++代码

    本示例探讨了如何使用C++实现服务器端,并用Java编写客户端,通过Socket进行通信。Socket编程是网络编程的基础,它允许两个不同的进程在同一个网络上进行通信。下面将详细介绍这个主题及其相关知识点。 1. **Socket...

    c++客户端和java(Netty)服务器端tcp通讯

    在Java端,Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。利用Netty,我们可以轻松实现TCP服务器,创建ServerBootstrap,配置通道处理器pipeline,监听客户端...

    服务端和客户端,java,C++实现代码

    Java以其跨平台的特性而闻名,它的Socket编程接口使得实现服务端和客户端通信变得相对简单。在Java中,服务端通常创建一个ServerSocket监听特定的端口,等待客户端的连接请求。一旦连接建立,服务器就可以通过Socket...

    Java和c++的Socket通信如何发送结构体

    总的来说,Java和C++的Socket通信发送结构体需要解决字节序转换和数据序列化的问题。在实现过程中,理解报文格式,正确处理字节序,以及在两端同步序列化和反序列化过程是成功通信的关键。在实际项目中,还可以考虑...

    c++ socket通信库

    **C++ Socket通信库** C++ Socket通信库是用于实现网络通信的一种工具,它基于操作系统提供的Socket接口,为开发者提供了一种在C++程序中进行网络数据交换的标准方法。Socket库简化了网络编程,允许程序员通过调用...

    java使用socket和c++通信

    文件"java和c++通信"可能包含了具体的示例代码,包括Java服务器端的非阻塞Socket实现、C++客户端的Socket连接代码,以及可能的数据交换协议实现。通过分析和学习这些代码,开发者可以更好地理解和掌握Java和C++间的...

    C++写的服务器与Java写的客户端通过Socket通信java代码

    - 接受连接:当有客户端请求连接时,服务器使用`accept()`函数接收连接,并返回一个新的Socket句柄用于和客户端通信。 - 数据收发:服务器使用`recv()`和`send()`函数来读取和发送数据。 - 关闭连接:完成通信后...

    C++高性能http服务端和客户端库源码.zip

    一个C++高性能http服务端和客户端库,个C++高性能http服务端和客户端库一个C++高性能http服务端和客户端库 一个C++高性能http服务端和客户端库 一个C++高性能http服务端和客户端库 一个C++高性能http服务端和客户端...

    c++实现socket:一个服务器对应多个客户端相互传递信息

    在提供的压缩包文件中,`client`和`server`两个文件可能分别包含了客户端和服务器的源代码。客户端通常会包含连接到服务器、发送和接收数据的功能,而服务器则会包含上述的监听、接受连接和多线程处理逻辑。通过分析...

    c++ socket编程实例(包含服务端及客户端)

    本代码是用c++实现的socket通讯实例,包括服务端和客户端. 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议...

    C++控制台下C/S模式的socket通信服务端和测试客户端

    在IT领域,网络通信是不可或缺的一部分,特别是在分布式系统和客户端-服务器(C/S)架构中。C++作为一门强大的编程语言,提供了丰富的库支持来实现网络通信,其中socket编程是常用的方法之一。本主题将深入讲解如何...

    socket通信客户端和服务端代码

    在本资源中,"socket通信客户端和服务端代码"提供了完整的示例,帮助开发者理解并实现基于Socket的通信过程。Socket接口通常用于TCP/IP协议栈,允许应用程序通过Internet进行通信。 首先,我们要了解Socket的基本...

    C++ 客户端与服务端通信

    在IT领域,特别是网络编程中,C++客户端与服务端之间的通信是构建分布式系统的关键技术之一。本篇文章将深入解析C++环境下实现客户端与服务端点对点通信的核心概念、设计模式以及具体实现细节。 ### 核心概念 在...

    C++关于socket的client&server库创建

    本篇文章将深入探讨如何使用C++创建基于Socket的客户端(Client)与服务器端(Server)库。Socket编程通常涉及TCP(传输控制协议)或UDP(用户数据报协议),这里我们将主要关注更可靠的TCP连接。 首先,我们需要...

    c++socket_server_client

    "c++socket_server_client"项目提供了服务端和客户端的示例,模拟了类似QQ群聊的功能,并且支持消息群发以及文件的二进制流传输和加密处理。下面,我们将详细介绍这些关键知识点。 首先,**Socket编程**是网络通信...

    C/C++服务器与Java客户端进行socket通信

    本教程将深入探讨如何在C/C++服务器环境下利用Visual Studio 2010与Java客户端环境下的Eclipse进行Socket通信。 一、C/C++服务器端(VS2010) 在Visual Studio 2010中,我们可以使用Winsock库来实现Socket编程。...

Global site tag (gtag.js) - Google Analytics