java socket封装_SOCKET的封装

SOCKET

的封装

C++

通用框架的设计

作者:

naven

1

SOCKET

封装介绍

Socket

通讯程序估计现在大多数应用系统都会涉及到,因为现在的世界是一个由

Internet

网络连接的世界,任何个人电脑或服务都可能会有数据交换,通过

TCP/UDP

这样的

Socket

通讯协议进行联系。开发这样的通讯程序会是很普遍也很类似,每种操作系统都实现了

Socket

通讯库并提供很相似的

API

,通讯步骤都遵循

RFC

规范。但是有些

API

的具体接口却稍有不同,比如

Socket IO API

win32

系统和

Unix

系统就不一样,

Win32

recv/send

Unix

使用标准统一的

read/write

,而且

socket

句柄在不同操作系统处理也不一样,等等这些都造成编写跨平台的

Socket

应用不太容易。另外编写服务器和客户端的处理步骤也很繁琐,

IP

地址和域名的转换也很麻烦,所以实现一个标准统一使用更简洁的

API

非常有用。本

C++

框架基本参考

Java

Socket

相关类实现了类似封装,除了

ServerSocket

实现稍有不同,其他原理和方法基本类似。用它编写网络应用基本不用考虑底层的协议处理,使用非常容易,代码也更简洁易读。

主要有如下一些类

class Socket

代表一个

TCP

连接的

Socket

对象

class DatagramSocket

代表一个

UDP

连接的

Socket

对象(暂未实现)

class MulticastSocket

一个

DatagramSocket

的子类用于多播(暂未实现)

class SocketAcceptor

一个

TCP

服务端的接收器

class SocketConnector

一个

TCP

客户端的连接器

class SocketInputStream

一个

Socket

连接的输入流

class SocketOutputStream

一个

Socket

连接的输出流

class SocketReader

一个

Socket

连接的读操作器

class SocketWriter

一个

Socket

连接的写操作器

Socket

的意思是在网络的机器之间建立一个通信线路。通过

TCP Sockets

发送或接收的操作时通过

InputStream

OutputStream

流处理的,

Socket

类的

getInputStream

getOutputStream

可以取得该

Socket

连接的输入

/

输出流对象。

SocketAcceptor

是用于服务器端的接收器,它处于接收的状态时会阻塞,直到接收到客户端的连接请求,这时就会创建一个

Socket

对象代表该服务器到此客户端的连接。而对应的

SocketConnector

是用于客户端的连接器,它向服务端发出连接请求,如果服务器允许连接,则也同时建立一个

Socket

对象表示它到服务器端的连接,这时就可以获取输入

/

输出流对象进行

Socket

通讯了。

2

Hello World!

下面的程序示例如何用上面的类进行

Scoket

通讯:

这是服务端的实现

cbef093dcc044b2793832001e2365e43.png

void

servertest()

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png

918e8df969f9f8c8d002f25cda86cade.png

{

df37983f39daa189b8c814e01a6a9011.png

//

定义一个接收器绑定 8000 端口

df37983f39daa189b8c814e01a6a9011.png

SocketAcceptor sa(

8000

);

df37983f39daa189b8c814e01a6a9011.png

while

(

1

)

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

918e8df969f9f8c8d002f25cda86cade.png

{

df37983f39daa189b8c814e01a6a9011.png

//

阻塞等待连接请求

df37983f39daa189b8c814e01a6a9011.png

Socket sk

=

sa.accept();

df37983f39daa189b8c814e01a6a9011.png

//

获取此连接的读操作器和写操作器

df37983f39daa189b8c814e01a6a9011.png

Reader

&

rd

=

sk.getReader();

df37983f39daa189b8c814e01a6a9011.png        Writer

&

wr

=

sk.getWriter();

df37983f39daa189b8c814e01a6a9011.png        String s; 

df37983f39daa189b8c814e01a6a9011.png

//

从客户端读取 10 个字节

df37983f39daa189b8c814e01a6a9011.png

rd.read(s,

10

);

df37983f39daa189b8c814e01a6a9011.png

//

向客户端写信息

df37983f39daa189b8c814e01a6a9011.png

wr.write(“read ok”);

df37983f39daa189b8c814e01a6a9011.png

//

关闭连接

df37983f39daa189b8c814e01a6a9011.png

sk.close();

4a5daaec04350a363f186a4d2c5ed6ce.png}

0ac3a2d53663ec01c7f7225264eeefae.png}

cbef093dcc044b2793832001e2365e43.png

这是客户端的实现

cbef093dcc044b2793832001e2365e43.png

void

clienttest()

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png

918e8df969f9f8c8d002f25cda86cade.png

{

df37983f39daa189b8c814e01a6a9011.png

//

定义一个连接器

df37983f39daa189b8c814e01a6a9011.png

SocketConnector sc;

df37983f39daa189b8c814e01a6a9011.png

//

连接指定的服务器地址及端口, 返回一个Socket对象

df37983f39daa189b8c814e01a6a9011.png

Socket sk

=

sc.connect(“localhost”,

8000

);

df37983f39daa189b8c814e01a6a9011.png

//

如果已成功连上

df37983f39daa189b8c814e01a6a9011.png

if

( sk.isConnected() )

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

918e8df969f9f8c8d002f25cda86cade.png

{

df37983f39daa189b8c814e01a6a9011.png

//

获取此连接的读操作器和写操作器

df37983f39daa189b8c814e01a6a9011.png

Reader

&

reader

=

sk.getReader();

df37983f39daa189b8c814e01a6a9011.png        Writer

&

writer

=

sk.getWriter();

df37983f39daa189b8c814e01a6a9011.png

//

可以在读操作器上建立一个带缓冲的读操作器

df37983f39daa189b8c814e01a6a9011.png

BufferedReader rd(reader);

df37983f39daa189b8c814e01a6a9011.png

//

向服务器发送信息

df37983f39daa189b8c814e01a6a9011.png

writer.write(“hello server”);

df37983f39daa189b8c814e01a6a9011.png

//

接收信息, 带缓冲的读操作器可以读取一行

df37983f39daa189b8c814e01a6a9011.png

rd.readLine(s);

df37983f39daa189b8c814e01a6a9011.png

//

关闭连接

df37983f39daa189b8c814e01a6a9011.png

sk.close();

4a5daaec04350a363f186a4d2c5ed6ce.png    }

0ac3a2d53663ec01c7f7225264eeefae.png}

cbef093dcc044b2793832001e2365e43.png

1

Socket

此类定义一个表示

Socket

连接的类,一个

Socket

是一个为在两台机器间通信的端点。一个

Socket

类的真实行为是通过一个

SocketImpl

类的诗体执行的。一个应用程序可以通过改变

Socket Factory

来创建

Socket

的具体实现,以适应本地的局域网防火墙。

Socket

类成员和主要接口定义如下:

cbef093dcc044b2793832001e2365e43.png

class

Socket :

public

AbstractFile

2f88ce130b654eb5dc6788e02dbcfc90.png

dbf989d57862681739b642d8621fe1f0.png

918e8df969f9f8c8d002f25cda86cade.png

{

df37983f39daa189b8c814e01a6a9011.png

protected

:

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

/**/

/*

*

df37983f39daa189b8c814e01a6a9011.png     * The implementation of this Socket.

4a5daaec04350a363f186a4d2c5ed6ce.png

*/

df37983f39daa189b8c814e01a6a9011.png    SocketImplAutoPtr _impl; 

df37983f39daa189b8c814e01a6a9011.png

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

/**/

/*

*

df37983f39daa189b8c814e01a6a9011.png     * Various states of this socket.

4a5daaec04350a363f186a4d2c5ed6ce.png

*/

df37983f39daa189b8c814e01a6a9011.png    BOOL _connected; 

df37983f39daa189b8c814e01a6a9011.png    BOOL _closed; 

df37983f39daa189b8c814e01a6a9011.png    BOOL _shutIn; 

df37983f39daa189b8c814e01a6a9011.pngBOOL _shutOut;

df37983f39daa189b8c814e01a6a9011.png

df37983f39daa189b8c814e01a6a9011.png

public

:

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

/**/

/*

*

df37983f39daa189b8c814e01a6a9011.png     * Creates an unconnected socket, with the

df37983f39daa189b8c814e01a6a9011.png     * system-default type of SocketImpl.

4a5daaec04350a363f186a4d2c5ed6ce.png

*/

df37983f39daa189b8c814e01a6a9011.pngSocket();

df37983f39daa189b8c814e01a6a9011.png

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

/**/

/*

*

df37983f39daa189b8c814e01a6a9011.png     * Returns an input stream for this socket.

df37983f39daa189b8c814e01a6a9011.png     *

df37983f39daa189b8c814e01a6a9011.png     * @return     an input stream for reading bytes from this socket.

4a5daaec04350a363f186a4d2c5ed6ce.png

*/

df37983f39daa189b8c814e01a6a9011.png    InputStream

&

getInputStream();

df37983f39daa189b8c814e01a6a9011.png

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

/**/

/*

*

df37983f39daa189b8c814e01a6a9011.png     * Gets an Reader for this socket.

4a5daaec04350a363f186a4d2c5ed6ce.png

*/

df37983f39daa189b8c814e01a6a9011.png    Reader

&

getReader();

df37983f39daa189b8c814e01a6a9011.png

f70a0fde2b51b7dd92a70e712e540cf6.png

edb48e6f68462ea23d9a824f01de40c5.png

/**/

/*

*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值