udp与tcp
一,udp
使用udp 发送/接收数据步骤:
1.创建客户端套接字
2.发送/接收数据
3.关闭套接字
1.import socket
2.def main():
3. # 1、创建udp 套接字
4. # socket.AF_INET 表示IPv4 协议AF_INET6 表示IPv6 协议
5. # socket.SOCK_DGRAM 数据报套接字,只要用于udp 协议
6. udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
7. # 2、准备接收方的地址
8. # 元组类型ip 是字符串类型端口号是整型
9. dest_addr = (‘192.168.113.111’, 8888)
10. # 要发送的数据
11. send_data = “我是要发送的数据”
12. # 3、发送数据
13. udp_socket.sendto(send_data.encode(“utf-8”), dest_addr)
14. # 4、等待接收方发送的数据如果没有收到数据则会阻塞等待,直到收到数据
15. # 接收到的数据是一个元组(接收到的数据, 发送方的ip 和端口)
16. # 1024 表示本次接收的最大字节数
17. recv_data, addr = udp_socket.recvfrom(1024)
18. # 5、关闭套接字
19. udp_socket.close()
20.if name == ‘main’:
21. main()
UDP 绑定端口号:
1.创建socket 套接字
2.绑定端口号
3.接收/发送数据
4.关闭套接字
1.import socket
2.def main():
3. # 1、创建udp 套接字
4. # socket.AF_INET 表示IPv4 协议AF_INET6 表示IPv6 协议
5. # socket.SOCK_DGRAM 数据报套接字,只要用于udp 协议
6. udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
7. # 2、绑定端口
8. # 元组类型ip 一般不写表示本机的任何的一个ip
9. local_addr = (’’, 7777)
10. udp_socket.bind(local_addr)
11. # 3、准备接收方的地址
12. # 元组类型ip 是字符串类型端口号是整型
13. dest_addr = (‘192.168.113.111’, 8888)
14. # 要发送的数据
15. send_data = “我是要发送的数据”
16. # 4、发送数据
17. udp_socket.sendto(send_data.encode(“utf-8”), dest_addr)
18. # 5、等待接收方发送的数据如果没有收到数据则会阻塞等待,直到收到数据
19. # 接收到的数据是一个元组(接收到的数据, 发送方的ip 和端口)
20. # 1024 表示本次接收的最大字节数
21. recv_data, addr = udp_socket.recvfrom(1024)
22. # 6、关闭套接字
23. udp_socket.close()
24.if name == ‘main’:
25. main()
二,tcp
TCP 客户端的创建流程:
1.创建TCP 的socket 套接字
2.连接服务器
3.发送数据给服务器端
4.接收服务器端发送来的消息
5.关闭套接字
1.import socket
2.def main():
3. # 1、创建客户端的socket
4. # socket.AF_INET 表示IPv4 协议AF_INET6 表示IPv6 协议
5. # socket.SOCK_STREAM 流式套接字,只要用于TCP 协议
6. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7. # 2、构建目标地址
8. server_ip = input(“请输入服务器端的IP 地址:”)
9. server_port = int(input(“请输入服务器端的端口号:”))
10. # 3、连接服务器
11. # 参数:元组类型ip 是字符串类型端口号是整型
12. client_socket.connect((server_ip, server_port))
13. # 要发送给服务器端的数据
14. send_data = “我是要发送给服务器端的数据”
15. # 4、发送数据
16. client_socket.send(send_data.encode(“gbk”))
17. # 5、接收服务器端恢复的消息, 没有消息会阻塞
18. # 1024 表示接收的最大字节数
19. recv_date= client_socket.recv(1024)
20. print(“接收到的数据是:”, recv_date.decode(‘gbk’))
21. # 6、关闭套接字
22. client_socket.close()
23.if name == ‘main’:
24. main()
TCP 服务器端的创建流程
1.创建TCP 服务端的socket
2.bing 绑定ip 地址和端口号
3.listen 使套接字变为被动套接字
4.accept 取出一个客户端连接,用于服务
5.recv/send 接收和发送消息
6.关闭套接字
1.import socket
2.
3.def main():
4. # 1、创建tcp 服务端的socket
5. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
6.
7. # 2、绑定
8. server_socket.bind((’’, 8888))
9.
10. # 3、listen 使套接字变为被动套接字
11. server_socket.listen(128)
12.
13. # 4、如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
14. # client_socket 用来为这个客户端服务
15. # tcp_server_socket 就可以省下来专门等待其他新客户端的链接
16. client_socket, client_addr = server_socket.accept()
17.
18. # 5、接收客户端发来的消息
19. recv_data = client_socket.recv(1024)
20. print(“接收到客户端%s 的数据:%s” % (str(client_addr), recv_data.decode(‘gbk’)))
21.
22. # 6、回复数据给客户端
23. client_socket.send(“收到消息”.encode(‘gbk’))
24.
25. # 7、关闭套接字
26. client_socket.close()
27. server_socket.close()
28.
29.if name == ‘main’:
30. main()
-------------------------------------------------------------------注意点:
tcp 服务器一般都需要绑定,否则客户端找不到服务器
tcp 客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port 等信息就好,
本地客户端可以随机
tcp 服务器中通过listen 可以将socket 创建出来的主动套接字变为被动的,这是做tcp 服务器
时必须要做的
当客户端需要链接服务器时,就需要使用connect 进行链接,udp 是不需要链接的而是直接发
送,但是tcp 必须先链接,只有链接成功才能通信
当一个tcp 客户端连接服务器时,服务器端会有1 个新的套接字,这个套接字用来标记这个客户
端,单独为这个客户端服务
listen 后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept 返回的新套接
字是标识这个新客户端的
关闭listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之
前已经链接成功的客户端正常通信。
关闭accept 返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close 后,服务器端会recv 解阻塞,并且返回的长度为0,因此服务器可
以通过返回数据的长度来区别客户端是否已经下线;同理当服务器断开tcp 连接的时候客户端
同样也会收到0 字节数据。