您的位置:首页 > 理论基础 > 计算机网络

udp与tcp

2018-11-21 14:58 183 查看

一,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 返回的新套接
字是标识这 4000 个新客户端的
 关闭listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之
前已经链接成功的客户端正常通信。
 关闭accept 返回的套接字意味着这个客户端已经服务完毕
 当客户端的套接字调用close 后,服务器端会recv 解阻塞,并且返回的长度为0,因此服务器可
以通过返回数据的长度来区别客户端是否已经下线;同理当服务器断开tcp 连接的时候客户端
同样也会收到0 字节数据。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: