更多功能

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

参数一:地址簇

  socket.AF_INET IPv4(默认)
  socket.AF_INET6 IPv6

  socket.AF_UNIX 只能够用于单一的Unix系统进程间通信

参数二:类型

  socket.SOCK_STREAM  流式socket , for TCP (默认)
  socket.SOCK_DGRAM   数据报式socket , for UDP

  socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
  socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
  socket.SOCK_SEQPACKET 可靠的连续数据包服务

参数三:协议

  0  (默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议

 UDP Demo

sk.bind(address)

  s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。

sk.listen(backlog)

  开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。

backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5
      这个值不能无限大,因为要在内核中维护连接队列

sk.setblocking(bool)

  是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。

sk.accept()

  接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

  接收TCP 客户的连接(阻塞式)等待连接的到来

sk.connect(address)

  连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

sk.connect_ex(address)

  同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061

sk.close()

  关闭套接字

sk.recv(bufsize[,flag])

  接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

sk.recvfrom(bufsize[.flag])

  与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

sk.send(string[,flag])

  将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

sk.sendall(string[,flag])

  将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

内部通过递归调用send,将所有内容发送出去。

sk.sendto(string[,flag],address)

  将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。

sk.settimeout(timeout)

  设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )

sk.getpeername()

  返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。

sk.getsockname()

  返回套接字自己的地址。通常是一个元组(ipaddr,port)

sk.fileno()

  套接字的文件描述符

极简CS架构测试

 1 #!/usr/bin/env python
2 # Author:Zhangmingda
3 import socket
4 print('创建客户端实例')
5 client = socket.socket()
6 print('开始连接服务器')
7 client.connect(('localhost',6969))
8 print('开始发送数据')
9 client.send(b'hello World')
10 print('开始接受数据')
11 recv_data = client.recv(1024)
12 print(recv_data)
13 print('关闭数据连接')
14 client.close()

socket客户端

1 C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day7/socket_client.py
2 创建客户端实例
3 开始连接服务器
4 开始发送数据
5 开始接受数据
6 b'HELLO WORLD'
7 关闭数据连接
8
9 Process finished with exit code 0

运行测试输出

 1 #!/usr/bin/env python
2 # Author:Zhangmingda
3 import socket
4 print('创建服务器socket实例')
5 server = socket.socket()
6 print('设置监听地址和端口')
7 server.bind(('0.0.0.0',6969))
8 print('开始监听地址和端口')
9 server.listen()
10 print('获取连接实例和客户端地址')
11 connect,addrs = server.accept()
12 print('客户端实例:',connect,"客户端地址信息:",addrs)
13 print('接收数据')
14 recv_data = connect.recv(1024)
15
16 print(recv_data)
17 print('将客户端发来的数据处理,返回给客户端')
18 connect.send(recv_data.upper())
19 print('关闭服务端')
20 server.close()

socket服务端

 1 C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day7/socket_server.py
2 创建服务器socket实例
3 设置监听地址和端口
4 开始监听地址和端口
5 获取连接实例和客户端地址
6 客户端实例: <socket.socket fd=300, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 62301)> 客户端地址信息: ('127.0.0.1', 62301)
7 接收数据
8 b'hello World'
9 将客户端发来的数据处理,返回给客户端
10 关闭服务
11
12 Process finished with exit code 0

服务端输出

C/S架构一个连接的持续收发数据

#!/usr/bin/env python
# Author:Zhangmingda
import socket
print('创建服务器socket实例')
server = socket.socket()
print('设置监听地址和端口')
server.bind(('0.0.0.0',6969))
print('开始监听地址和端口')
server.listen()
while True:
print('等待客户端来连接,获取连接实例和客户端地址')
connect,addrs = server.accept() #此处出现等待现象,等待客户端的连接,等不到会卡在这里等,等到了就赋值给变量
print("客户端:",addrs,'已连接','客户端实例:',connect)
if connect:
while True:
print('接收数据...')
recv_data = connect.recv(1024)
print('接收到数据:',recv_data.decode())
if recv_data.decode() == '断开':
print('\033[31;1m关闭客户端%s:%s连接\033[0m'% addrs)
connect.close()
break
print('把波多野结衣,返回给客户端')
connect.send('给你个波多野结衣'.encode())

Soket服务端

#!/usr/bin/env python
# Author:Zhangmingda
import socket
print('创建客户端实例')
client = socket.socket()
print('开始连接服务器')
client.connect(('localhost',6969))
while True:
msg = input('>>>输入要发送的数据')
print('开始发送数据')
client.send(msg.encode()) #发送汉子,必须encode()成bytes类型数据进行传输
if msg == '断开':
print('关闭数据连接')
client.close()
break
print('开始接受数据')
recv_data = client.recv(1024)
print(recv_data.decode()) #接收bytes类型的数据,必须decode()为默认的unicode编码的字符才能被打印

Socket客户端

C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day7/socket_server.py
创建服务器socket实例
设置监听地址和端口
开始监听地址和端口
等待客户端来连接,获取连接实例和客户端地址
客户端: ('127.0.0.1', 59264) 已连接 客户端实例: <socket.socket fd=300, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 59264)>
接收数据...
接收到数据: 我要A片
把波多野结衣,返回给客户端
接收数据...
接收到数据: 断开
关闭客户端127.0.0.1:59264连接
等待客户端来连接,获取连接实例和客户端地址
客户端: ('127.0.0.1', 59265) 已连接 客户端实例: <socket.socket fd=300, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 59265)>
接收数据...
接收到数据: 我要B片
把波多野结衣,返回给客户端
接收数据...
接收到数据: 断开
关闭客户端127.0.0.1:59265连接
等待客户端来连接,获取连接实例和客户端地址

服务端输出

C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day7/socket_client.py
创建客户端实例
开始连接服务器
>>>输入要发送的数据我要A片
开始发送数据
开始接受数据
给你个波多野结衣
>>>输入要发送的数据断开
开始发送数据
关闭数据连接

客户端1输出

C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day7/socket_client.py
创建客户端实例
开始连接服务器
>>>输入要发送的数据我要B片
开始发送数据
开始接受数据
给你个波多野结衣
>>>输入要发送的数据断开
开始发送数据
关闭数据连接 Process finished with exit code 0

客户端2输出

客户端一次只能接受指定1024个长度(bytes),超过接不到:靠while循环接受的测试代码如下

#!/usr/bin/env python
# Author:Zhangmingda
import socket,os
print('创建服务器socket实例')
server = socket.socket()
print('设置监听地址和端口')
server.bind(('0.0.0.0',6969))
print('开始监听地址和端口')
server.listen()
while True:
print('等待客户端来连接,获取连接实例和客户端地址')
connect1,addrs = server.accept() #此处出现等待现象,等待客户端的连接,等不到会卡在这里等,等到了就赋值给变量
print("客户端:",addrs,'已连接','客户端实例:',connect1)
if connect1:
while True:
print('接收命令...')
recv_data = connect1.recv(1024)
print('收到命令:',recv_data)
if recv_data.decode() == '断开':
print('\033[31;1m关闭客户端%s:%s连接\033[0m'% addrs)
connect1.close()
break
res = os.popen(recv_data.decode()).read()
print('命令执行结果为:',res)
if res:
print('OK命令执行返回不为空,结果给客户端')
print('发送长度:%s给客户端'%len(res.encode())) #计算生成数据的bytes类型的数据长度
connect1.send(str(len(res.encode())).encode())#只能发送str类型的bytes类型数据
print('发送全部数据给客户端')
connect1.send(res.encode())
else:
print('命令执行结果返回为空')
connect1.send('命令执行结果返回为空'.encode())

服务端

#!/usr/bin/env python
# Author:Zhangmingda
import socket
print('创建客户端实例')
client = socket.socket()
print('开始连接服务器')
client.connect(('localhost',6969))
while True:
msg = input('>>>输入要发送的命令:')
print('开始发送数据')
client.send(msg.encode('utf-8')) #发送汉子,必须encode()成bytes类型数据进行传输
if msg == '断开':
print('关闭数据连接')
client.close()
break
print('开始接受数据')
recv_size = client.recv(1024)
print('数据总长度:',recv_size.decode())
recv_data = b'' #这里预置一个存放接收数据的bytes类型对象,新来的超过1024的分段数据就一点点加上去
while len(recv_data) != int(recv_size.decode()):
recv_data += client.recv(1024)
print('\033[31;1m已接收数据长度:\033[0m',len(recv_data))
else:
print('数据接收完毕,总长度:',len(recv_data))
# print('数据内容:',recv_data.decode())
# print(recv_data.decode()) #接收bytes类型的数据,必须decode()为默认的unicode编码的字符才能被打印

客户端

C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day7/socket_server.py
创建服务器socket实例
设置监听地址和端口
开始监听地址和端口
等待客户端来连接,获取连接实例和客户端地址
客户端: ('127.0.0.1', 53033) 已连接 客户端实例: <socket.socket fd=300, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 53033)>
接收命令...
收到命令: b'ipconfig /all'
命令执行结果为:
Windows IP 配置 主机名 . . . . . . . . . . . . . : zhangmingda-wyfa1314
主 DNS 后缀 . . . . . . . . . . . :
节点类型 . . . . . . . . . . . . : 混合
IP 路由已启用 . . . . . . . . . . : 否
WINS 代理已启用 . . . . . . . . . : 否
DNS 后缀搜索列表 . . . . . . . . : openstacklocal 以太网适配器 以太网 2: 连接特定的 DNS 后缀 . . . . . . . : openstacklocal
描述. . . . . . . . . . . . . . . : Red Hat VirtIO Ethernet Adapter
物理地址. . . . . . . . . . . . . : FA-16-3E-90-6B-0D
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::307e:6f74:b69b:c175%16(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.0.52(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
获得租约的时间 . . . . . . . . . : 2018年6月12日 17:42:23
租约过期的时间 . . . . . . . . . : 2018年6月19日 17:09:41
默认网关. . . . . . . . . . . . . : 192.168.0.1
DHCP 服务器 . . . . . . . . . . . : 192.168.0.254
DHCPv6 IAID . . . . . . . . . . . : 402265662
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-21-A9-30-F1-FA-16-3E-6E-4C-BF
DNS 服务器 . . . . . . . . . . . : 100.125.1.250
114.114.114.114
TCPIP 上的 NetBIOS . . . . . . . : 已启用 隧道适配器 isatap.openstacklocal: 媒体状态 . . . . . . . . . . . . : 媒体已断开
连接特定的 DNS 后缀 . . . . . . . : openstacklocal
描述. . . . . . . . . . . . . . . : Microsoft ISATAP Adapter
物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是 OK命令执行返回不为空,结果给客户端
发送长度:1800给客户端
发送全部数据给客户端
接收命令...

服务端输出

C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day7/socket_client.py
创建客户端实例
开始连接服务器
>>>输入要发送的命令:ipconfig /all
开始发送数据
开始接受数据
数据总长度: 1800
已接收数据长度: 1024
已接收数据长度: 1800
数据接收完毕,总长度: 1800 数据内容:
Windows IP 配置 主机名 . . . . . . . . . . . . . : zhangmingda-wyfa1314
主 DNS 后缀 . . . . . . . . . . . :
节点类型 . . . . . . . . . . . . : 混合
IP 路由已启用 . . . . . . . . . . : 否
WINS 代理已启用 . . . . . . . . . : 否
DNS 后缀搜索列表 . . . . . . . . : openstacklocal 以太网适配器 以太网 2: 连接特定的 DNS 后缀 . . . . . . . : openstacklocal
描述. . . . . . . . . . . . . . . : Red Hat VirtIO Ethernet Adapter
物理地址. . . . . . . . . . . . . : FA-16-3E-90-6B-0D
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::307e:6f74:b69b:c175%16(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.0.52(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
获得租约的时间 . . . . . . . . . : 2018年6月12日 17:42:23
租约过期的时间 . . . . . . . . . : 2018年6月19日 17:09:40
默认网关. . . . . . . . . . . . . : 192.168.0.1
DHCP 服务器 . . . . . . . . . . . : 192.168.0.254
DHCPv6 IAID . . . . . . . . . . . : 402265662
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-21-A9-30-F1-FA-16-3E-6E-4C-BF
DNS 服务器 . . . . . . . . . . . : 100.125.1.250
114.114.114.114
TCPIP 上的 NetBIOS . . . . . . . : 已启用 隧道适配器 isatap.openstacklocal: 媒体状态 . . . . . . . . . . . . : 媒体已断开
连接特定的 DNS 后缀 . . . . . . . : openstacklocal
描述. . . . . . . . . . . . . . . : Microsoft ISATAP Adapter
物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
>>>输入要发送的命令:

客户端输出

socket网络编程基础模块的更多相关文章

  1. python全栈开发从入门到放弃之socket网络编程基础

    网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

  2. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

  3. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

    BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符, ...

  4. windows socket网络编程基础知识

    下面介绍网络7层协议在WINDOWS的实现: 7层协议 WIN系统 ________________________________________ 7 应用层 7 应用程序 ____________ ...

  5. java架构《Socket网络编程基础篇》

    本章主要介绍Socket的基本概念,传统的同步阻塞式I/O编程,伪异步IO实现,学习NIO的同步非阻塞编程和NIO2.0(AIO)异步非阻塞编程. 目前为止,Java共支持3种网络编程模型:BIO.N ...

  6. socket网络编程基础小记

    "一切皆Socket!" 话虽些许夸张.可是事实也是,如今的网络编程差点儿都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通 ...

  7. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础

    IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t  inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换 ...

  8. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 4

    网络调试工具 tcpdump 功能:打印指定网络接口中与布尔表达式匹配的报头信息 关键字: ①类型:host(默认).net.port host 210.27.48.2 //指明是一台主机 net 2 ...

  9. Linux socket网络编程基础 tcp和udp

    Socket TCP网络通信编程 首先,服务器端需要做以下准备工作: (1)调用socket()函数.建立socket对象,指定通信协议. (2)调用bind()函数.将创建的socket对象与当前主 ...

随机推荐

  1. setoolkit的钓鱼实验

    1.在kali中打开setoolkit 2.在菜单中选择第一个进入社会工程学攻击 3.选择第二个模块属于网站攻击向量 4.选择第五个模块,进行web劫持攻击 5.选择第二个,进行网站克隆 6.发现访问 ...

  2. CF1574D The Strongest Build

    考虑到有\(m\)个限制,可以考虑\(m+1\)个最大的答案,这样可以利用鸽笼原理得到答案. 这是一般做法. 但是这样的题目,我们发现\(n\)个操作都是独立的. 那么我们可以全部都选取最大,并以此调 ...

  3. Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)

    Atcoder 题面传送门 & 洛谷题面传送门 神仙调整+乱搞题. 首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发. 首先将 \(a_i ...

  4. [R] ignore.case区分大小写参数

    字符串操作的函数(如contains),很多都包含ignore.case参数,默认是T,即不分大小写,稍不注意就会掉坑里,最好的习惯是下意识地加入这个参数. 举个例子: 我要选择An的列,就用下面这个 ...

  5. 自动添加shell脚本头部信息

    autocmd BufNewFile *.sh exec ":call AddTitleForShell()" function AddTitleForShell() call a ...

  6. 数据库命令补全工具mycli

    一.安装 我的数据库安装的是win版本,安装python后,直接命令行: 1 pip install mycli 即可. 二.使用 进入命令行后输入: 1 mycli -u root -p 88888 ...

  7. A Child's History of England.2

    They made boats of basket-work, covered with the skins of animals, but seldom, if ever, ventured far ...

  8. SpringBoot Logback 日志配置

    目录 前言 日志格式 日志输出 日志轮替 日志级别 日志分组 小结 前言 之前使用 SpringBoot 的时候,总是习惯于将日志框架切换为 Log4j2,可能是觉得比较靠谱,也可能年龄大了比较排斥新 ...

  9. h5移动端设备像素比dpr介绍

    首先介绍一下概念 devicePixelRatio其实指的是window.devicePixelRatio window.devicePixelRatio是设备上物理像素和设备独立像素(device- ...

  10. JS模块化,Javascript 模块化管理的历史

    模块管理这个概念其实在前几年前端度过了刀耕火种年代之后就一直被提起. 直接回想起来的就是 cmd amd commonJS 这三大模块管理的印象.接下来,我们来详细聊聊. 一.什么是模块化开发 为了让 ...