一、udp用户数据报协议(写信的模型:在通信开始,不需要建立相关的连接,只需要发送数据即可,类似于生活中的写信)(不安全:发的消息可能会丢,对方不会请求再发一遍)
1.ipv4:_ _ _ ._ _ _ . _ _ _ ._ _ _ 192.168.1.1
注:192.168 是代表的同一个网络下会同一个编号,1.1是代表主机的编号
2.端口:
知名端口:不能随便用的1—1023(端口号是固定的)
动态端口:1024—65535(是指当一个系统程序或应用程序需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用)
(80端口分配给HTTP服务,21端口分配给FTP服务)
4.程序运行起来的程序就叫进程
5. udp发送
注:用 (ping ip地址)查看是否能与对方的ip进行通讯
注:如果不能完成通讯,VMware的虚拟网络,那不是ip地址,把VMware虚拟网停用,就可以通讯
ip地址在同一个网络不能重复,端口号在同一台电脑里面不能重复。
7.udp传输模型
代码:
import socket
def send_msg(udp_socket):
"""发送消息"""
# 获取要发送的内容
dest_ip = input("请输入对方的ip:")
dest_port = int(input("请输入对方的port:"))
send_data = input("请输入要发送的消息:")
udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
"""接收数据"""
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("", 6664))
# 循环循环来进行处理事情
while True:
print("-----xxx聊天器-----")
print("1:发送消息")
print("2:接收消息")
print("0:退出系统")
op = input("请输入功能:")
if op == "1":
# 发送
send_msg(udp_socket)
elif op == "2":
# 接收并显示
recv_msg(udp_socket)
elif op == "0":
break
else:
print("输入有误请重新输入...")
if __name__ == "__main__":
main()
注意:由于没有线程导致不能使发送和接收同时进行。
二、tcp传输控制协议(打电话模型)(安全:如果丢了或者数据有问题,对方可以要求再发一遍,保证数据能够被对方接收稳定性)
注:TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
1、稳定性之应答模式(udp与tcp)
2、可靠传输
(1)、服务器代码:
import socket
def main():
#1.买个手机(创建套接字 socket)
tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.插入手机卡(绑定本地信息 bind)
tcp_server_socket.bind(("",7890))
#3.将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动 listen)
tcp_server_socket.listen(128)
while True:#循环为多个客户服务
print("等待一个新的客户端到来........")
#4.等待别人的电话到来(等待客户端的链接 accept)(堵塞)
#new_client_socket接收一个新的套接字;client_addr接收一个链接你的客户端的地址(谁给我打的)
new_client_socket,client_addr=tcp_server_socket.accept()
print("一个新的客户端已经到来%s"%str(client_addr))
print(client_addr)#(是谁链接的你,返回的就是谁的ip和端口)
while True:#为同一个客户端 服务多次
#接收客户发来的请求
recv_data=new_client_socket.recv(1024)
print("客户端发送过来的请求是:%s"%recv_data)
#如果recv解堵塞,那么有2种方式:
#1.客户端发送过来数据
#2.客户端调用close导致 这里 recv解堵塞
if recv_data:#判断是否为空
#回送一部分数据给客户端;注:不需要在填写对方的ip与端口,因为上面已经创建了链接,直接回复信息就可以了
new_client_socket.send("hahaahfdsf---ok-----".encode("gbk"))
else:
break
#关闭套接字
new_client_socket.close()
print("已经为%s客户服务完毕")
tcp_server_socket.close()#关闭就不会等待新的客户xxxxx.accept就会失败
if __name__=="__main__":
main()
(2)客户端代码:
import socket
def main():
#1.创建套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.获取服务器的ip port
socket_ip=input("请输入对方的ip:")
socket_port=int(input("请输入对方的port"))
#3.链接服务器
tcp_socket.connect((socket_ip,socket_port),)
#4.获取下载的文件名字
download_file_name=input("请输入要下载的文件名字:")
#5.将文件名字发送到服务器
tcp_socket.send(download_file_name.encode("utf-8"))
#6.接收文件中的数据
recv_data=tcp_socket.recv(1024*1024)
#7.保存接收到的数据到一个文件中
with open("[新]"+download_file_name,"wb") as f:
f.write(recv_data)
#8.关闭套接字
tcp_socket.close()
注意:没有线程,因此只能发送等待服务器反应才能继续发送,发送与接收只能执行一个,当执行发送时就不能执行接收,当执行接收时就不能执行发送。
3.tcp注意事项