更多功能

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. 力扣 - 剑指 Offer 42. 连续子数组的最大和

    题目 剑指 Offer 42. 连续子数组的最大和 思路1(分析数组的规律) 我们可以从头到尾逐个累加,若之前的累加和小于0,那就从丢弃之前的累加,从当前开始重新累加,同时在遍历过程中比较记录下最大值 ...

  2. 『学了就忘』Linux权限管理 — 56、不可改变位权限(chattr)

    目录 1.命令格式 2.查看文件系统属性chattr权限 3.示例 文件系统属性chattr权限,也叫不可改变位权限,该权限没有风险,但是他能限制root用户. 1.命令格式 [root@localh ...

  3. IntelliJ IDEA 2021.3 正式发布:支持远程开发、IDE故障排查等多项优化改进

    作者:程序猿DD 博客:https://blog.didispace.com/ 昨天刚刚跟大家聊了Jetbrains即将推出轻量级编辑器Fleet,以挑战 VS Code的消息,今天又收到了Intel ...

  4. 洛谷 P3285 - [SCOI2014]方伯伯的OJ(平衡树)

    洛谷题面传送门 在酒店写的,刚了一整晚终于调出来了-- 首先考虑当 \(n\) 比较小(\(10^5\) 级别)的时候怎么解决,我们考虑将所有用户按排名为关键字建立二叉排序树,我们同时再用一个 map ...

  5. Codeforces 1408I - Bitwise Magic(找性质+集合幂级数)

    Codeforces 题面传送门 & 洛谷题面传送门 Yet another immortal D1+D2 I %%%%%% 首先直接统计肯定是非常不容易的,不过注意到这个 \(k\) 非常小 ...

  6. Matlab指针

    Matlab指针 第一印象貌似是Matlab中不存在指针,所有变量与函数的赋值都是按值传递的,不会对参数进行修改.其实Matlab提供了handle类作为指针代替品.只要我们利用handle子类,就可 ...

  7. 毕业设计之zabbix之nginx状态监控

    监控脚本: [root@webone.quan.bbs ~]$vim /usr/local/zabbix/script/ngx_status.sh #!/bin/bash##************* ...

  8. nginx二级域名指向不同文件项目配置

    需要使用泛域名解析, 并且加上空的判断,以保证没有二级域名的也可以访问 核心配置 server_name ~^(?<subdomain>.+)\.caipudq\.cn$;if ( $su ...

  9. Netty | 第1章 Java NIO 网络编程《Netty In Action》

    目录 前言 1. Java 网络编程 1.1 Javs NIO 基本介绍 1.2 缓冲区 Buffer 1.2 通道 Channel 1.3 选择器 Selector 1.4 NIO 非阻塞网络编程原 ...

  10. vivo 敏感词匹配系统的设计与实践

    一.前言 谛听系统是vivo的内容审核平台,保障了vivo各互联网产品持续健康的发展.谛听支持审核多种内容类型,但日常主要审核的内容是文本,下图是一个完整的文本审核流程,包括名单匹配.敏感词匹配.AI ...