什么是套接字?

来源:互联网 发布:php curl批处理封装类 编辑:程序博客网 时间:2024/05/17 03:42

(转载)

“套接字”或者“插座”(Socket)也是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。线缆的每一端都插入一个“套接字”或者“插座”里。当然,机器之间的物理性硬件以及电缆连接都是完全未知的。抽象的基本宗旨是让我们尽可能不必知道那些细节。
在Java中,我们创建一个套接字,用它建立与其他机器的连接。从套接字得到的结果是一个InputStream以及OutputStream(若使用恰当的转换器,则分别是Reader和Writer),以便将连接作为一个IO流对象对待。有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接;以及Socket,客户用它初始一次连接。一旦客户(程序)申请建立一个套接字连接,ServerSocket就会返回(通过accept()方法)一个对应的服务器端套接字,以便进行直接通信。从此时起,我们就得到了真正的“套接字-套接字”连接,可以用同样的方式对待连接的两端,因为它们本来就是相同的!此时可以利用getInputStream()以及getOutputStream()从每个套接字产生对应的InputStream和OutputStream对象。这些数据流必须封装到缓冲区内。可按第10章介绍的方法对类进行格式化,就象对待其他任何流对象那样。
对于Java库的命名机制,ServerSocket(服务器套接字)的使用无疑是容易产生混淆的又一个例证。大家可能认为ServerSocket最好叫作“ServerConnector”(服务器连接器),或者其他什么名字,只是不要在其中安插一个“Socket”。也可能以为ServerSocket和Socket都应从一些通用的基础类继承。事实上,这两种类确实包含了几个通用的方法,但还不够资格把它们赋给一个通用的基础类。相反,ServerSocket的主要任务是在那里耐心地等候其他机器同它连接,再返回一个实际的Socket。这正是“ServerSocket”这个命名不恰当的地方,因为它的目标不是真的成为一个Socket,而是在其他人同它连接的时候产生一个Socket对象。
然而,ServerSocket确实会在主机上创建一个物理性的“服务器”或者侦听用的套接字。这个套接字会侦听进入的连接,然后利用accept()方法返回一个“已建立”套接字(本地和远程端点均已定义)。容易混淆的地方是这两个套接字(侦听和已建立)都与相同的服务器套接字关联在一起。侦听套接字只能接收新的连接请求,不能接收实际的数据包。所以尽管ServerSocket对于编程并无太大的意义,但它确实是“物理性”的。
创建一个ServerSocket时,只需为其赋予一个端口编号。不必把一个IP地址分配它,因为它已经在自己代表的那台机器上了。但在创建一个Socket时,却必须同时赋予IP地址以及要连接的端口编号(另一方面,从ServerSocket.accept()返回的Socket已经包含了所有这些信息)。

套接字是什么意思是什么东西_什么叫--什么是套接字

接字接口可分为三类:公认端口 注册端口 动态和/或私有端口

 

套接字,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程

应用层通过传输层进行数据通信时,tcp和udp会遇到同时为多个应用程序进程提供并发服务的问题。多个tcp连接或多个应用程序进程可能需要通过同一个 tcp协议端口传输数据。 为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与tcp/ip协议交互提供了称为套接字(socket)的接口。

(注:每个 TCP 报文头部都包含源端口号(source port)和目的端口号(destination port),用于标识和区分源端设备和目的端设备的应用进程。在TCP/IP 协议栈中,源端口号和目的端口号分别与源IP 地址和目的IP 地址组成套接字(socket),唯一的确定一条TCP 连接。)(故源端口号与目的端口号未必要一致)

区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的ip地址、使用的传输层协议(tcp或udp)和使用的端口号。socket原意是 “插座”。通过将这3个参数结合起来,与一个“插座”socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入socket中,该socket将这段信息发送给另外一个socket中,使这段信息能传送到其他程序中。如图1:

我们来分析一下图1,host a上的程序a将一段信息写入socket中,socket的内容被host a的网络管理软件访问,并将这段信息通过host a的网络接口卡发送到host b,host b的网络接口卡接收到这段信息后,传送给host b的网络管理软件,网络管理软件将这段信息保存在host b的socket中,然后程序b才能在socket中阅读这段信息。

假设在图1的网络中添加第三个主机host c,那么host a怎么知道信息被正确传送到host b而不是被传送到host c中了呢?基于tcp/ip网络中的每一个主机均被赋予了一个唯一的ip地址,ip地址是一个32位的无符号整数,由于没有转变成二进制,因此通常以小数点分隔,如:198.163.227.6,正如所见ip地址均由四个部分组成,每个部分的范围都是0-255,以表示8位地址。

值得注意的是ip地址都是32位地址,这是ip协议版本4(简称ipv4)规定的,目前由于ipv4地址已近耗尽,所以ipv6地址正逐渐代替ipv4地址,ipv6地址则是128位无符号整数。

假设第二个程序被加入图1的网络的host b中,那么由host a传来的信息如何能被正确的传给程序b而不是传给新加入的程序呢?这是因为每一个基于tcp/ip网络通讯的程序都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的短口号保留给标准应用程序,比如pop3的端口号就是110,每一个套接字都组合进了ip地址、端口、端口号,这样形成的整体就可以区别每一个套接字

windows sockets:流式套接字

http://tech.163.com /school· 2005-10-09 15:03:48 · 来源: msdn

本文描述流式套接字,它是两种可用的 windows sockets 类型中的一种。(另一种类型是数据文报套接字 。)

流式套接字提供没有记录边界的数据流:可以是双向的字节流(应用程序是全双工:可以通过套接字同时传输和接收)。可依赖流传递有序的、不重复的数据。(“有序”指数据包按发送顺序送达。“不重复”指一个特定的数据包只能获取一次。)这能确保收到流消息,而流非常适合处理大量数据。

网络传输层可将数据拆分为或分组为若干个大小适当的数据包。 csocket 类将为您处理打包和解包。

流基于显式连接:套接字 a 请求与套接字 b 建立连接;套接字 b 接受或拒绝此连接请求。

打电话的情况与流非常相似:正常情况下,接听方听到您的话和您讲话时的顺序一样,没有重复和遗漏。流套接字适合文件传输协议 (ftp) 这类实现,此协议有利于传输任意大小的 ascii 或二进制文件。

如果必须保证数据送达而且数据大小很大时,流式套接字优于数据文报套接字。有关流式套接字的更多信息,请参见 windows sockets 规范。该规范可在 platform sdk 中获得。

mfc 示例 chatter 和 chatsrvr 都使用流式套接字。这些示例可能已经设计为使用数据文报套接字向网络上的所有接收套接字广播。而目前的设计更好,这是因为:

广播模型受制于网络“洪水”(或“风暴”)问题。

后来采用的客户端-服务器模型更有效。

流式模型提供可靠的数据传输,数据文报模型则未提供。

最终模型利用在 carchive 类借给 csocket 类的 unicode 和 ansi 套接字应用程序之间通信的能力。

注意:如果使用 csocket 类,则必须使用流。如果将套接字类型指定为 sock_dgram ,则 mfc 断言失败

windows sockets 示例列表

http://tech.163.com /school· 2005-10-09 16:37:56 · 来源: msdn

下列 mfc 示例程序阐释了 windows sockets 功能:

chatter

chatter 是一个 windows 套接字客户端示例应用程序。它是一个具有拆分窗口的单文档界面 (sdi) 应用程序,允许用户将消息发送到讨论服务器 (chatsrvr),讨论服务器然后将消息同时发送给其他多个 chatter 用户。

通过使 chatter 应用程序向服务器发送广播数据文报包而不是消息流,可以在不使用客户端/服务器模型的情况下编写 chatter 和 chatsrvr。然而,与流式套接字不同,数据文报套接字不能保证一定会被传送;因此,一些消息可能不会到达讨论中的所有其他用户。生成并运行示例

生成并运行 chatter 示例

打开解决方案 chatter.sln。

在“生成”菜单上单击“生成”。

在“调试”菜单上单击“开始执行(不调试)”。

运行 chatter 时,有一个“setup”对话框请求输入以下内容:

handle

用来寻址所有消息的名称。例如,可以选择“”。发送的所有消息的前面都会自动加上名称“”。

server

运行 chatsvr 示例的计算机的 ip 地址。

channel

标识要加入的讨论的数字(一台计算机可以运行多个讨论服务器)。

提供了所有这些信息并单击“ok”后,主应用程序窗口随即出现。若要发送消息,请在下部窗格中键入消息。按 enter 键发送消息。若要发送多行消息,请按 ctrl+enter 键。关键字

此示例说明了以下关键字:

afxgetapp、afxmessagebox、carchive::flush、carchive::isstoring、ccontrolbar::enabledocking、ccontrolbar::getbarstyle、ccontrolbar::setbarstyle、cdialog::domodal、cdocument::deletecontents、cdocument::getfirstviewposition、cdocument::getnextview、cdocument::onnewdocument、ceditview::geteditctrl、ceditview::serializeraw、cframewnd::dockcontrolbar、cframewnd::enabledocking、cframewnd::oncreateclient、cframewnd::setactiveview、cobject::assertvalid、cobject::dump、cobject::iskindof、cobject::serialize、crect::size、csplitterwnd::createview、csplitterwnd::getpane、cstatusbar::create、cstatusbar::setindicators、cstring::getbuffer、cstring::getlength、cstring::isempty、cstring::loadstring、cstring::releasebuffer、ctoolbar::create、ctoolbar::loadbitmap、ctoolbar::setbuttons、cview::getdocument、cview::ondraw、cwinapp::adddoctemplate、cwinapp::initinstance、cwinapp::loadstdprofilesettings、cwinapp::onfilenew、cwnd::destroywindow、cwnd::dodataexchange、cwnd::getclientrect、cwnd::getwindowtext、cwnd::getwindowtextlength、cwnd::killtimer、cwnd::onchar、cwnd::oncreate、cwnd::ontimer、cwnd::precreatewindow、cwnd::settimer、cwnd::setwindowtext、setwindowtext、rand、wsprintf

注意一些示例(如此示例)尚未经过ssbbww修改以反映 visual c++ 向导、库和编译器的变化,但仍说明了如何完成所需的任务。

请参见

mfc 示例

chatsrvr

chatsrvr 是 windows 套接字服务器示例应用程序,它是一个单文档界面 (sdi) 应用程序,用于为 chatter 示例的客户端实现讨论服务器。

通过使 chatter 应用程序向服务器发送广播数据文报包而不是消息流,可以在不使用客户端/服务器模型的情况下编写 chatter和 chatsrvr。然而,与流式套接字不同,数据文报套接字不能保证一定会被传送;因此,一些消息可能不会到达讨论中的所有其他用户。生成并运行示例

生成并运行 chatsrvr 示例

打开解决方案 chatsrvr.sln。

在“生成”菜单上单击“生成”。

在“调试”菜单上单击“开始执行(不调试)”。

运行 chatsrvr 时会显示一个请求输入“channel”的“discussion”对话框。“channel”是标识要支持的讨论的数字(一台计算机可以运行多个讨论服务器)。提供了此信息并单击“ok”后,主应用程序窗口随即出现。关键字

此示例说明了以下关键字:

afxmessagebox、carchive::flush、carchive::isstoring、ccmdui::enable、ccmdui::settext、ccontrolbar::enabledocking、ccontrolbar::getbarstyle、ccontrolbar::setbarstyle、cdialog::domodal、cdocument::deletecontents、cdocument::onnewdocument、ceditview::geteditctrl、cframewnd::dockcontrolbar、cframewnd::enabledocking、cobject::assertvalid、cobject::dump、cobject::serialize、cstatusbar::create、cstatusbar::setindicators、cstring::getbuffer、cstring::loadstring、cstring::releasebuffer、ctoolbar::create、ctoolbar::loadbitmap、ctoolbar::setbuttons、cview::getdocument、cview::ondraw、cwinapp::adddoctemplate、cwinapp::exitinstance、cwinapp::initinstance、cwinapp::loadstdprofilesettings、cwinapp::onfilenew、cwnd::dodataexchange、cwnd::getwindowtextlength、cwnd::oncreate、setwindowtext、wsprintf

注意 一些示例(如此示例)尚未经过ssbbww修改以反映 visual c++ 向导、库和编译器的变化,但仍说明了如何完成所需的任务。

语法标注解释 socket英音:['sɔkit]美音:['sɑkɪt]socket的中文翻译以下结果由译典通提供词典解释名词 n. [C]
1.托座,承口2.【电】插座;插口
She put the electric plug into the socket. 
她将电插头插到了插座里。 3.(人体的)窝;槽;臼
She feared her eyes might actually pop out of their sockets. 
她害怕她的眼睛会真的从眼窝里瞪出来。 
及物动词 vt. 
1.将...装入插座2.给...配插座以下结果来自互联网网络释义socket
1.插座;套;外接头;承口
香港建造业常用英文词汇(十一)(20)-b...
socket 插座;套;外接头;承口
http://www.yiyicheng....2.座,插座 ②孔,槽臼
医学词汇(S)[全国翻译资格认证考试论坛]...
socket ①座,插座 ②孔,槽臼
http://www.visionchar...3.套接字
常用词汇总结 - 『 思科网络技术 』 -...
socket 套接字
http://www.sharecente...
0 0