socket的英文原义是“孔”或“插座”。作为4BDS UNIX的进程通信机 制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几 种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机 犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
套接字
现象解释
socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机, 主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相 当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在 场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号 和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。
电话系统
在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的技术细节对他都是透明的,这也与socket机制非常相似。socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。
至此,我们对socket进行了直观的描述。抽象出来,socket实质上提供了进程通信的端 点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。在网间网内 部,每一个socket用一个半相关描述:
(协议,本地地址,本地端口)
一个完整的socket有一个本地唯一的socket号,由操作系统分配。
最重要的是,socket 是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket 系统调用。 客户随机申请一个socket (相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。
socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket 半相关为全局所公认非常重要。读者不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的socket 固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。
1.什么是socket
所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例, 操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
重要的Socket API
重要的Socket API:java .net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。
Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
getOutputStream方法连接的另一端将得到输入,同时返回一个 OutputStream对象实例。 注意:其中getInputStream和getOutputStream方法均可能会产生一个IOException,它必须被捕获,因为它们返回的流 对象,通常都会被另一个流对象使用。
SOCKET连接过程
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套 接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接 收其他客户端套接字的连接请求。
如何开发一个Server-Client模型的程序
开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
常用的Socket类型
有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向 连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:int socket(int domain, int type, int protocol);domain指明所使用的协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族);type参数指 定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。 Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针, 它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据 结构分配存储空间。 Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。 socket在测量软件中的使用也很广泛
编辑本段socket函数
简介
SOCKET socket( int af, int type, int protocol );
应用程序调用socket函数来创建一个能够进行网络通信的套接字。
第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据报以及协议首部);
第三个参数指定应用程序所使用的通信协议。
该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回 INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结 构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结 构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
下面是一个创建流套接字的例子:
struct protoent *ppe;
ppe=getprotobyname("tcp");
SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);
PHP语言中的SOCKET
PHP有强大的SOCKET操作能力,它的处理方式更接近于C,但是没有C的繁琐。可以看作是对C操作的SOCKET的一个封装。
开启一个socket监听示例程序:
<?php
// 设置一些基本的变量
$host="192.168.1.99";
$port=1234;
// 设置超时时间
set_time_limit(0);
// 创建一个Socket
$socket=socket_create(AF_INET,SOCK_STREAM,0) or die("Could not create
socket\n");
//绑定Socket到端口
$result=socket_bind($socket,$host,$port) or die("Could not bind to
socket\n");
// 开始监听链接
$result=socket_listen($socket,3) or die("Could not set up socket
listener\n");
// accept incoming connections
// 另一个Socket来处理通信
$spawn=socket_accept($socket) or die("Could not accept incoming
connection\n");
// 获得客户端的输入
$input=socket_read($spawn,1024) or die("Could not read input\n");
// 清空输入字符串
$input=trim($input);
//处理客户端输入并返回结果
$output=strrev($input) ."\n";
socket_write($spawn,$output,strlen($output)) or die("Could not write
output\n");
// 关闭sockets
socket_close($spawn);
socket_close($socket);
?>
Socket
应用程序通常通过"Socket"向网络发出请求或者应答网络请求
常用的Socket类型
有两种:流式Socket - SOCK_STREAM
数据报式Socket - SOCK_DGRAM
两种模型:
对等模型
C/S模型
1.对等模型:
1.建立socket:socket
int socket(
int domain,//地址族的类型AF_UNIX AF_INET
int type,//支持的数据格式:流SOCK_STREAM/报文SOCK_DGRAM
int protocol);//支持的协议,建议为0
返回值:
成功返回文件描述符号。
失败返回-1;
2.绑定在地址上(文件目录地址)URL(Universe Resource Location)
协议://路径/文件名
file:///usr/bin/ls
http://192.168.0.72/index.php
struct sockaddr;
struct sockaddr_un;un=unix
struct sockaddr_in;in=internet
int bind(int fd,//socket描述符号
struct sockaddr*addr,//绑定地址
socklen_t size);//地址长度
3.接收数据
read/recv/recvfrom
4.关闭socket
1.建立socket:socket
2.连接到目标:connect(可选)
3.发送数据:write/send/sendto
4.关闭close
2.C/S模型
Server Client
建立socket:socket 建立socket:socket
绑定地址:bind 建立连接:connect
监听:listen
接收:accept
read/write read/write
close close
int listen(int fd,int num);
0:监听成功
-1:失败
int accept(int fd,
struct sockaddr*addr,//返回连接着的地址
socklen_t* len)//接收返回地址的缓冲长度
返回:
-1:接收失败
>=0:对应客户的文件描述符号
?
分享到:
相关推荐
[Perl文]IO::Socket简介 ''''''''''''''''''' new()方法: SOCKET对象变量=IO::Socket::INET->new(SOCKET变量值); 实例: $sock=IO::Socket::INET->new('192.168.1.2:23'); 讲解: 所有的PERL对象编程都把对象...
Socket简介 简介 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。...
### Web Socket简介及应用 #### 一、WebSocket概述 WebSocket是一种新型的通信协议,它作为HTML5中的一个重要组成部分,为Web开发带来了革命性的变化。在介绍WebSocket之前,我们需要回顾一下Web开发的历史,尤其...
- 建立 Socket 连接涉及服务器监听、客户端请求和连接确认三个步骤,与 TCP 连接类似,但更底层,可自定义协议和处理方式。 4. **Socket 连接与 TCP 连接的对比**: - HTTP 是基于 Socket 实现的应用层协议,提供...
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些...
SuperSocket简介** SuperSocket设计的目标是让开发者能够快速搭建网络应用,它支持自定义协议,可以轻松地处理各种业务逻辑。框架的核心组件包括SocketServer和SocketAppServer,前者用于处理基础的Socket通信,后...
一、HP-Socket简介 HP-Socket是一个C++编写的网络通信库,它提供了丰富的API接口,支持TCP、UDP等多种网络协议。该框架不仅具备多线程处理能力,还支持异步事件驱动模型,以实现高效的网络通信。其易源代码的特点...
一、Socket简介 Socket是网络通信的基础接口,它允许应用程序通过Internet进行通信。在C#中,System.Net.Sockets命名空间提供了Socket类,用于实现TCP和UDP协议。TCP(传输控制协议)提供面向连接的、可靠的数据传输...
#### 一、Socket简介 **Socket** 是一种网络通信方式,它允许两台计算机之间进行数据交换。在互联网世界里,Socket 的历史远远早于 Java 语言的诞生,但 Java 使得 Socket 的使用变得更加简单高效。本章节将详细...
1. **Lua Socket简介** Lua Socket是一个由Diego Nehab开发的开源库,其目标是为Lua提供一个易于使用的网络编程接口。它基于Lua的简洁语法,使得开发者可以快速地创建网络应用程序,如Web服务器、客户端、代理等。 ...
#### Socket简介 Socket是应用层与传输层之间的一个抽象层,用于实现网络应用程序之间的通信。它可以理解为两个应用程序之间的一个端到端的连接。在TCP/IP协议族中,Socket通常被用来实现客户端与服务器之间的通信...
2. **Socket简介**: Socket是操作系统提供的接口,它允许应用程序实现进程间的网络通信。Socket可以基于TCP(面向连接,可靠传输)或者UDP(无连接,尽力而为传输)。 **二、WPF中集成Socket** 在WPF项目中,我们...
**一、Socket简介** Socket,又称套接字,是网络通信的基本单元,它提供了进程间的通信能力,允许不同机器上的程序通过网络进行交互。Socket分为两种类型:流式套接字(Stream Sockets, TCP)和数据报套接字...
SuperSocket简介 SuperSocket旨在简化套接字服务器的开发流程,提供了一种面向对象的模型,允许开发者专注于业务逻辑,而不是底层的网络通信细节。它支持自定义协议,可以轻松处理多种网络协议,如HTTP、FTP、TCP...
一、SuperSocket简介 SuperSocket设计初衷是为了简化基于TCP/IP协议的网络通信开发,它提供了一套完整的解决方案,包括服务端和客户端的实现,使得开发者可以专注于业务逻辑,而无需关心底层通信细节。SuperSocket...
**Socket简介** Socket,又称套接字,是网络编程的基本接口,它为应用程序提供了网络通信的能力。Socket允许两个或多个设备通过TCP/IP协议进行数据传输。在iOS开发中,我们通常使用C语言风格的低级API(如CFStream)...
1. **Socket简介** - Socket起源于UNIX系统的4BSD版本,用于进程间的通信。在网络环境中,Socket成为了TCP/IP协议族的一部分,为开发网络应用程序提供了便利。 - Socket是一个通信端点,它包含了IP地址和端口号,...
1. **SuperSocket简介**:文档首先会介绍SuperSocket的基本概念,包括其设计理念、核心功能和优点,例如它的轻量级特性、强大的插件机制以及对多线程和异步操作的支持。 2. **安装与配置**:详细步骤指导如何在C#...