udp发送基本案例
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dest_addr = ('192.168.103.114', 60000)
send_data = input("请输入发送的内容:")
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
udp_socket.close()
if __name__ == "__main__":
main()
udp接收基本案例
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 如果想本地接收数据,则必须固定端口
local_addr = ('', 7788) # ip一般不写,代表本地任何一个ip
udp_socket.bind(local_addr)
recv_data = udp_socket.recvfrom(1024) # 1024表示本地接收的最大字节数
# recv_data 返回的是一个元组(接收到的数据,(发送方的ip,port))
print(recv_data[0].decode('gbk'))
udp_socket.close()
if __name__ == "__main__":
main()
"""
单工:只能收或者发
半双工:能收发但是不能同时进行
全双工,收发可同时
"""
tcp客户端
import socket
# tcp严格区分客户端和服务器,而udp不分区
def main():
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.connect(('192.168.103.114', 6000))
tcp_socket.send("测试".encode('utf-8'))
tcp_socket.close()
if __name__ == "__main__":
main()
tcp服务端
import socket
def main():
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.bind(('', 7788))
# 128 代表同一时刻最多只能128个客户端链接,一般都写128但是针对不同系统影响不大
# 指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求
# 应该理解为阻塞队列的长度,总共与服务器连接的客户端一共有num + 1个。
# 阻塞队列FIFO,当连接客户端结束后阻塞队列里的第一个客服端与服务器连接成功
tcp_socket.listen(128)
client_socket, clientAddr = tcp_socket.accept()
print(clientAddr)
# 只要recv_data是None则一定是客户端关闭了,客户端close服务端会接收到空,可以if recv_data直接判断
recv_data = client_socket.recv(1024)
print(recv_data.decode('gbk'))
client_socket.send("thank".encode('gbk'))
# 代表不会继续给这个客户端服务
client_socket.close()
# 关闭则不会有新的客户端到来,所以针对多客户端链接的时候,该句的关闭应该在循环外面
tcp_socket.close()
if __name__ == "__main__":
main()