网络编程之socket编程

Posted featherwit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程之socket编程相关的知识,希望对你有一定的参考价值。

套接字介绍

socket介绍

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

套接字介绍

套接字的概念很简单,每台主机有一个唯一的主机地址标识,同时主机内还有标识自己进程的序号id,称作端口,将这两个标识符结合就构成了一个套接字(socket),这个套接字能唯一标识网络中的一个进程。(网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为“套接字”。)

一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

  • 基于文件类型的套接字: AF_UNIX

   unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

  • 基于网络类型的套接字: AF_INET

         还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET

 

基于TCP协议的套接字通信

套接字工作流程

技术图片

1. 服务器先初始化Socket对象来建立一个套接字, 用这个套接字完成通信的监听。
2. 然后用bind函数来绑定一个端口号和IP地址。
3. 服务器调用listen函数对服务器的这个端口和IP地址进行监听,等待客户机的连接。
4. 客户机初始化Socket对象, 设定远程 IP 和端口。
5. 然后调用connect函数连接服务器,如果连接成功,这时客户端与服务器端的连接就建立了。
6. 服务器用accept函数来接受远程计算机的连接,建立起与客户机之间的通信。
7. 建立连接以后,客户机用write函数向socket中写入数据。也可以用 read 函数读取服务器发送来的数据。
8. 服务器用read函数读取客户机发送来的数据,也可以用 write 函数来发送数据。
9. 完成通信以后,用 close 函数关闭 socket 连接。

socket模块函数用法

import socket
socket.socket(socket_family,socket_type,protocal=0)
# socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。

# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
技术图片
服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字

面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间

面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
View Code

基于tcp的套接字 

 

以上是关于网络编程之socket编程的主要内容,如果未能解决你的问题,请参考以下文章

android开发系列之socket编程

Python网络编程之socket应用

Python—网络编程之tcp编程

java之socket编程(BIO)

winform socket编程之TCPListener

PHP Socket编程 之 php cc攻击代码与防范方法