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

基础篇写到这里,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)和延时达到完美平衡。

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

时间: 2024-10-16 21:03:13

JAVA基础篇八(Java,C++中的网络)的相关文章

java基础篇(三) ----- java面向对象的三大特性之多态

封装(encapsulation) 类使得数据和对数据的操作捆绑在一起,从而对使用该类的其他人来说,可以不管它的实现方法,而只管用它的功能,从而实现所谓的信息隐藏: 继承(inheritance) 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类.这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用.比如可以先定义一个类叫animal,animal具有以下属性:   眼睛,鼻子,耳朵 而又由ani

java基础篇(二) ----- java面向对象的三大特性之继承

java面向对象的三大特性之继承: 复用代码是java众多引人注目的功能之一,但是想要成为极具革命性的语言,仅仅是复制代码并对其加以改变是不够的.它必须能够做更多的事.引自<Think in java>    而代码复用也是程序员一直不断追求的.由此来说下代码复用的一种方式 java面向对象的三大特性--继承!! 在面向对象程序设计中,继承机制可以有效地组织类的结构.确定类之间的关系,在已有类的基础上开发新的类.继承机制在程序代码复用.提高软件开发效率.降低软件系统维护成本等方面具有重要作用.

java基础篇(一) ----- java面向对象的三大特性之封装

java面向对象的三大特性之封装:   封装(Encapsulation)是面向对象的一个重要特征,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节. 通俗的讲所谓封装就是将属性和方法捆绑到一起,封装到一个对象中去, 形成一个不可分割的独立单位,以及尽可能隐藏对象的内部结构,也就是说,如果我们使用了封装技术的话,别人就只能用我们做出来的东西而看不见我们做的这个东西的内部结构了. 如果形容一个人(假设把人看做一个类),我们可以用姓名.年龄,性别等来描述,如果不封

Java基础篇Socket网络编程中的应用实例

说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法. 要求:客户端通过Socket通信技术上传本地一

java基础篇---I/O技术(三)

接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream).使用对象输出流输出序列化对象的步骤,有时也成序列化,而使用对象输入流读入对象的过程,有时也称为反序列化 一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息. 对象序列化就是把一个对象变成二进制的数据流的一个方法,通过对象序列化可以反驳的

[Java 05 OO] (基础篇) 《Java开发实战经典》

p5OO 第五章 面向对象 (基础篇) Notes (1), Constructor / this / String   String str1 = "hello"; 解释 : 是把一个在堆内存空间的使用权给了 str1 对象.   String str2 = "hello"; str1 == str2 是 true   String 字符串的内容不可改变 (2), Java 常用的内存区域    1), 栈内存空间    2), 堆内存空间    3), 全局数据

java基础篇IO流的规律

前两篇降了IO流中的字节流和字符流复制的例子,今天来总结一下IO流的规律 掌握好IO流的规律,再开发中会很好用 下面来总结一下: 1,明确源和目的 源:输入流 InputStream 和Reader 目的:输出流 OutputStream 和Writer 2,操作的数据是否是纯文本. 是:使用字符流 不是:使用字节流 3,当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分 源设备: 内存,硬盘,键盘 目的设备: 内存,硬盘,控制台 这里的源就是你想进行的操作,比如说你想从c盘复制一个文

黑马程序员——Java基础篇之对象归要

1.static关键字 1.1.static可以修饰成员变量,成员方法,还有类(其中这里的类是内部类) 1.2.static修饰的部分会随着类的加载而加载: 加载过程:当JVM执行static修饰的代码时,会在内存的共享区给static部分开辟一个空间,供该类持有,static部分不是某个对象的部分,而是该类共有的,所以当一个函数会被多个对象调用时,最好定义成static,这样比较节省空间. 1.3.静态方法只能访问静态成员 原因:如果静态方法中调用了非静态的变量,那么由于静态方法是随着类的加载

Java 基础篇之反射

Java 基础篇之反射 反射# 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象# 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使用 Class 类的 forName(String clazzName) 静态方法.字符串参数的值是某个类的全限定类名,必须包含完整的包名 调用某个类的 class 属性 调用某个对象的 getClass() 方法.该方法是 java.lang.Object 类中的一个方