python中网络编程总结(udp,tcp)

一、udp用户数据报协议(写信的模型:在通信开始,不需要建立相关的连接,只需要发送数据即可,类似于生活中的写信)(不安全:发的消息可能会丢,对方不会请求再发一遍)

1.ipv4:_ _ _ ._ _ _ . _ _ _ ._ _ _ 192.168.1.1

注:192.168 是代表的同一个网络下会同一个编号,1.1是代表主机的编号

2.端口:

python中网络编程总结(udp,tcp)_第1张图片

 

知名端口:不能随便用的1—1023(端口号是固定的)

动态端口:1024—65535(是指当一个系统程序或应用程序需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用)

(80端口分配给HTTP服务,21端口分配给FTP服务)

4.程序运行起来的程序就叫进程

5. udp发送

python中网络编程总结(udp,tcp)_第2张图片

注:用 (ping ip地址)查看是否能与对方的ip进行通讯python中网络编程总结(udp,tcp)_第3张图片

注:如果不能完成通讯,VMware的虚拟网络,那不是ip地址,把VMware虚拟网停用,就可以通讯

ip地址在同一个网络不能重复,端口号在同一台电脑里面不能重复。

6、udp接收python中网络编程总结(udp,tcp)_第4张图片

7.udp传输模型

python中网络编程总结(udp,tcp)_第5张图片

代码:

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)

python中网络编程总结(udp,tcp)_第6张图片

2、可靠传输

python中网络编程总结(udp,tcp)_第7张图片python中网络编程总结(udp,tcp)_第8张图片

(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注意事项

 python中网络编程总结(udp,tcp)_第9张图片

 

你可能感兴趣的:(python)