Python基础教程之网络编程(2)

全双工
两个人都能发消息,能同时发,比如打电话;

udp使用同一套接字收且发数据 """socket套接字是全双工""" import socket def main(): udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_socket.bind(('192.168.13.1', 8080)) # 让用户输入要发送的ip地址和端口 dest_ip = input("请输入你要发送数据的ip地址:") dest_port = int(input("请输入你要发送数据的端口号:")) # 从键盘获取要发送的数据 send_data = input("请输入你要发送的数据:") # 使用套接字收发数据 udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port)) # 套接字可以同时 收发数据; recv_data = udp_socket.recvfrom(1024) print(recv_data) # 关闭套接字 udp_socket.close() # 按ctrl+c退出 if __name__ == "__main__": main()

在这里体现不出来socket是全双工,因为现在解释器只能按照流程,一步一步走下去,后面学习了进程线程协程就可以做到了。

tcp tcp-可靠传输 tcp采取的机制

采用发送应答机制

超时重传

错误校验

流量控制和阻塞管理

tcp与udp的区别

tcp更安全可靠,udp相对没那么安全可靠;

面向连接

有序数据传输

重发丢失的数据

舍弃重复的数据包

无差错的数据传输

阻塞/流量控制

tcp,udp应用场景

tcp应用场景:下载,发送消息
udp应用场景:电话,视频直播等

tcp客户端

tcp客户端发送数据

import socket def main(): # 1.创建tcp的套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.链接服务器 tcp_socket.connect(('193.168.11.1', 8080)) # 3.发送/接收消息 send_data = input("请输入你要发送的消息:") tcp_socket.send(send_data.encode("utf-8")) # 4.关闭套接字 tcp_socket.close() if __name__ == "__main__": main() tcp服务器

监听套接字,专门用来监听的;
accept会对应新创建的套接字,当监听套接字收到一个请求后,将该请求分配给新套接字,由此监听套接字可以继续去监听了,而新套接字则为该胡克段服务。

import socket def main(): # 创建tcp套接字 tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_service_socket.bind(('', 8080)) # 让默认的套接字由主动变为被动 tcp_service_socket.listen(128) # 等待客户端的链接 new_client_socket, client_addr = tcp_service_socket.accept() print("链接的客户端地址为:", client_addr) # 接收客户端发送过来的请求 recv_data = new_client_socket.recvfrom(1024) print(recv_data) # 给客户端回送消息 new_client_socket.send("hahahah".encode("utf-8")) new_client_socket.close() tcp_service_socket.close() if __name__ == '__main__': main()

listen里面的参数,表示同时只允许128个链接访问。

QQ不绑定端口的运行原理-扩展

udp和tcp并用;
使用QQ,先登录,登录后告诉腾讯服务器此QQ运行的端口,发消息时,通过腾讯服务器转发给另一个QQ;
不绑定端口也有一个好处,就是允许多开,即一个电脑上可以运行多个QQ;

recv和recvfrom的区别

recvfrom里面不仅有发过来的数据,还有发过来数据的人的信息;
recv里面就只有数据;

tcp客户端服务端流程梳理 tcp服务器流程梳理

创建服务器套接字

绑定本地信息

让默认的套接字由主动变为被动

等待客户端的链接,堵塞

被客户端链接后,创建一个新的客服套接字为客户端服务;

接收客户端发送的消息,堵塞

接收客户端发送的消息后,给客户端回消息

关闭客服套接字,关闭服务端套接字

tcp注意点

tcp服务器一般情况下都需要綁定,否则客户端找不到这个服务器。

tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip, port等信息就好,本地客户端可以随机。

tcp服务器通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的。

当客户端需要链接服务器时,就需��使用connect进行链接, udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信。

当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务。

liston后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的。

关闭isten后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。

关闭accept返回的套接字意味着这个客户端已经服务完毕。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/eb06d851f51d59563dbfa7aa24e3aa69.html