JAVA基础篇八(Java,C++中的网络)

bigelephant 发布于1年前 阅读22845次
0 条评论

基础篇写到这里,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端:

java" style="padding: 0.3em; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; color: rgb(51, 51, 51); border-radius: 4px; margin-top: 0px; margin-bottom: 1.5em; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; border: 1px solid rgba(0, 0, 0, 0.14902); overflow-y: auto; background-color: rgb(246, 246, 246);">
/**
 *TCPServer
 *@author Winty wintys@gmail.com
 *@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 wintys@gmail.com
 *@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)和延时达到完美平衡。

版权声明:本文为博主原创文章,未经博主允许不得转载。

需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。