一.网络编程
1.网络编程基础
2.Socket编程-简介
3.Socket编程-udp编程
为看到效果先安装网络调试助手NetAssist.exe
3.1使用socket发送数据
from socket import *
s = socket(AF_INET, SOCK_DGRAM) #创建套接字
addr = ('192.168.1.103', 8080) #准备目标方的地址,网络助手的地址
data = "Hello Wrold"
#发送数据时,python3需要将字符串转成byte
#encode(‘utf-8’)# 用utf-8对数据进行编码,获得bytes类型对象
#decode()反过来
s.sendto(data.encode(),addr)
s.close()
运行程序后效果如下:
3.2使用socket接受数据
# 我们可以使用socket来接受网络助手发送过来的数据
from socket import *
s = socket(AF_INET, SOCK_DGRAM) #创建套接字
addr = ('192.168.1.103', 8080) #准备目标方的地址,网络助手的地址
data = "Hello World"
s.sendto(data.encode(),addr) # 发送给网络助手
#等待接收数据
#1024表示本次接收的最大字节数
redata = s.recvfrom(1024)
print(redata)
s.close()
运行程序后,在网络助手上给程序发送一条数据。效果如下:
3.3 绑定信息
- 绑定信息:让一个进程可以使用固定的端口
- 如果不绑定端口,我们每运行一次程序系统就会自动分配一个端口
from socket import *
s = socket(AF_INET, SOCK_DGRAM) #创建套接字
s.bind(('', 8788)) #绑定一个端口,ip地址和端⼝号,ip⼀般不⽤写
addr = ('192.168.1.103', 8080) #准备接收方地址
data = input("请输入:")
s.sendto(data.encode(),addr)
redata = s.recvfrom(1024) #1024表示本次接收的最⼤字节数
print(redata)
s.close()
运行程序效果如下:
3.4 聊天室
聊天室
from socket import *
import time
#1创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
bindAddr = ("",7088)
udpSocket.bind(bindAddr)#绑定
while True:
#接收对方发送的数据
recvData = udpSocket.recvfrom(1024)
print('【%s】 %s.%s' %(time.ctime(),recvData[1],recvData[0].decode("GB2312"))) # 格式化输出获取到的数据
a = input("请输入:")
udpSocket.sendto(a.encode('GB2312'),('192.168.1.103',8080))
#5关闭套接字
udpSocket.close()
3.5 全双工聊天室
#导入模块
import threading
import time
from socket import *
#实现接受消息
class Recive(threading.Thread):
def run(self):
udpsocket = socket(AF_INET,SOCK_DGRAM) #创建套接字
udpsocket.bind(("", 8089)) # 绑定地址,bind参数为元组.注意是要给接受消息的进程绑定端口,这样网络助手才知道发送给谁。
while True:
recivedata = udpsocket.recvfrom(1024) #接受最大为1024字节的消息
# 格式化输出接受到的数据
print("{0}_{1}给你发送消息:{2}".format(recivedata[1][0],recivedata[1][1],recivedata[0].decode("GB2312")))
#实现发送消息
class Set(threading.Thread):
def run(self):
udpsocket = socket(AF_INET,SOCK_DGRAM)
while True:
a = input("请输入:")
udpsocket.sendto(a.encode("GB2312"),("192.168.1.103",8080)) #发送消息给指定地址
if __name__ == "__main__":
recive = Recive()
set = Set()
recive.start() #启动子线程1完成接受消息
set.start() #启动子线程2来完成发送消息
运行结果如下:
4.字符集
5.wireshark抓包
6.TFTP协议
7.struct模块使用
8.udp广 播
9.数据包在网络中的通信过程
10.Socket编程-TCP编程
10.1 简介
10.2单进程TCP模型
服务端代码:
from socket import *
serSocket = socket(AF_INET, SOCK_STREAM)
localAddr = ('',7788) #
serSocket.bind(localAddr)
serSocket.listen(5)
while True:
newSocket,destAddr = serSocket.accept()
try:
while True:
recvData = newSocket.recv(1024) # 接受客户端发送的请求
newSocket.send(b'hello I am server ') # 给客户端发送数据
if len(recvData)>0:
print("接收到", str(destAddr),recvData)
else: #如果收到的客户端数据长度为0,代表客户端已经调用close()下线
print("%s-客户端已关闭" %str(destAddr))
break
finally:
newSocket.close()
serSocket.close()
客服端代码:
from socket import *
clientSocket = socket(AF_INET,SOCK_STREAM)
serAddr = ('192.168.1.103',7788)
clientSocket.connect(serAddr) # 连接服务端
clientSocket.send(b'hello I am client') # 给服务端发送数据
recvData = clientSocket.recv(1024) # 接受服务端发送的数据
print("接受到的数据为:",recvData)
clientSocket.close()
10.3多进程TCP模型
10.4多线程TCP模型