基础篇写到这里,C++和JAVA的基础知识也要讲完了,至于更深入的使用,则需要单独寻找每种语言特有的类库。
讲到网络,不可避免地要讲TCP/IP的基本使用方法。本文只对两种语言的网络实现做简单介绍,后续学习中如果有详细说明,会逐步添加到本文中。
1、C++网络知识
简单的TCP/IP:
server端:
#include <WINSOCK2.H> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") void main() { //创建套接字 WORD myVersionRequest; WSADATA wsaData; myVersionRequest=MAKEWORD(1,1); int err; err=WSAStartup(myVersionRequest,&wsaData); if (!err) { printf("已打开套接字\n"); } else { //进一步绑定套接字 printf("嵌套字未打开!"); return; } SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字 //需要绑定的参数 SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址 addr.sin_port=htons(6000);//绑定端口 bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成 listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数 ////////////////////////////////////////////////////////////////////////// //开始进行监听 ////////////////////////////////////////////////////////////////////////// SOCKADDR_IN clientsocket; int len=sizeof(SOCKADDR); while (1) { SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听 char sendBuf[100]; sprintf(sendBuf,"welcome %s to bejing",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里 send(serConn,sendBuf,strlen(sendBuf)+1,0); char receiveBuf[100];//接收 recv(serConn,receiveBuf,strlen(receiveBuf)+1,0); printf("%s\n",receiveBuf); closesocket(serConn);//关闭 WSACleanup();//释放资源的操作 } }
client端:
#include <WINSOCK2.H> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") void main() { int err; WORD versionRequired; WSADATA wsaData; versionRequired=MAKEWORD(1,1); err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息 if (!err) { printf("客户端嵌套字已经打开!\n"); } else { printf("客户端的嵌套字打开失败!\n"); return;//结束 } SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN clientsock_in; clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); clientsock_in.sin_family=AF_INET; clientsock_in.sin_port=htons(6000); //bind(clientSocket,(SOCKADDR*)&clientsock_in,strlen(SOCKADDR));//注意第三个参数 //listen(clientSocket,5); connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接 char receiveBuf[100]; recv(clientSocket,receiveBuf,101,0); printf("%s\n",receiveBuf); send(clientSocket,"hello,this is client",strlen("hello,this is client")+1,0); closesocket(clientSocket); WSACleanup(); }
上面的例子只能作为熟悉TCP/UDP使用的简单例子,在实际开发中,我们常常需要使用开源的库莱完成开发。推荐一篇比较全面介绍开源C++网络库的文章:
http://blog.csdn.net/langeldep/article/details/6976120
摘要:
在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO。
Boost的ASIO是一个异步IO库,封装了对Socket的常用操作,简化了基于socket程序的开发。支持跨平台。
libevent是一个C语言写的网络库, 官方主要支持的是类linux 操作系统, 最新的版本添加了对windows的IOCP的支持。由于IOCP是异步IO,与linux下的POLL模型,EPOLL模型,还有freebsd的KQUEUE等这些同步模型在用法上完全不一致,所以使用方法也不一样,就好比ACE中的Reactor和Proactor模式一样, 使用起来需要转变思路。如果对性能没有特别的要求, 那么使用libevent中的select模型来实现跨平台的操作,
select模型可以横跨windows, linux, unix,solaris等系统。
libev是一个C语言写的,只支持linux系统的库,我以前研究的时候只封装了EPOLL模型, 不知道现在的新版有没有改进。使用方法类似libevent, 但是非常简洁,代码量是最少的一个库,也就几千行代码。显然这样的代码跨平台肯定是无法支持的了, 如果你只需要在linux下面运行,那用这个库也是可以的。
2、JAVA网络知识
网络编程无非就是Server端的监听和客户端的连接,因此它的基础很简单,也许难度大就在异步网络通信方面,以及一些框架的使用,这里暂且将TCP/IP的简单使用贴出来,并介绍一些框架的使用。
TCP/IP的简单例子(来源:http://blog.csdn.net/wintys/article/details/3525619):
Server端:
/** *TCPServer *@author Winty [email protected] *@version 2008-12-15 */ import java.io.*; import java.net.*; class TCPServer{ public static void main(String[] args)throws IOException{ ServerSocket listen = new ServerSocket(5050); Socket server = listen.accept(); InputStream in = server.getInputStream(); OutputStream out = server.getOutputStream(); char c = (char)in.read(); System.out.println("收到:" + c); out.write('s'); out.close(); in.close(); server.close(); listen.close(); } }
Client端:
/** *TCPClient *@author Winty [email protected] *@version 2008-12-15 */ import java.io.*; import java.net.*; class TCPClient{ public static void main(String[] args)throws IOException{ Socket client = new Socket("127.0.0.1" , 5050); InputStream in = client.getInputStream(); OutputStream out = client.getOutputStream(); out.write('c'); char c = (char)in.read(); System.out.println("收到:" + c); out.close(); in.close(); client.close(); } }
JAVA网络框架:
- MINA 为开发高性能和高可用性的网络应用程序提供了非常便利的框架;支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序
- Grizzly 设计与一般的nio框架相比是比较不同的,主要不同点在于读和写都是采用blocking方式,并且使用临时selector ;线程模型高度可配置,不过据作者介绍在跑一个selector主线程处理ACCEPT,用线程池处理read和write性能表现最好,这点不出意料。
- Nettty 提供了一组基于事件的API来开发高性能, 可管理的TCP/IP服务端或客户端应用程序. 对于要求建立高性能的网络应用来说,Netty提供许多基本特性,像readiness selection, 线程池, 写缓冲DoS的预防, 可重用的缓冲等.
- NIO Framework 搭建在Java NIO library之上,封装了原始NIO的大部分复杂性。利用NIO Framework能够很容易地开发安全,高性能的Java网络应用程序。
- QuickServer 一个免费的开源Java库,用于快速创建健壮的多线程、多客户端TCP服务器应用程序。使用QuickServer,用户可以只集中处理应用程序的逻辑/ 协议。
- xSocket 一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。
- ioServer 高性能,易扩展的网络框架,相对于Apache的MINA更加轻量级,源码更容易读懂,源码中有大量详细的中文注解,是一个非常不错的学习框架,框架主要至力于解决中国市场上手机网游的服务器端程序的编写。
IoServer构建简单服务器例程(更详细的例程可下载例程包,或进入Wiki查看)服务器接收一个来自客户端的整型,并加一返回给客户端 - XNIO 一个帮助你简化NIO应用程序开发的Java包;提供了一个独特和易于使用的API,用于结合blocking和非blocking操作,即使是在同一个channel上,也可以允许你利用简单和低延迟性的blocking I/O,同时还能获得非blocking I/O的优势;还引入了一个功能强大的基于回调的接口,可以大大简化基于traditional state machine的非blocking应用,并让您的应用程序之间的吞吐量(throughput)和延时达到完美平衡。
版权声明:本文为博主原创文章,未经博主允许不得转载。