本集学习网络编程的基础udp发送消息
python中首发数据有几个问题要解决
1,从哪里发送,从哪里接收,ip,端口
2,发送的数据,与接收的数据编码是否一致,关系到数据能否被正确发送,被正确解码
Udp的发送流程如下
发送流程如下 接收数据流程如下
1,创建套接字 sock 1,创建套接字
2,发送数据() sendto 2,绑定本机ip及端口 sock.blind
3,关闭套接字 close 3,接收数据 recivefrom
4,关闭套接字 close
发送流程如下
1 import socket 2 3 """ 4 5 """ 6 """ 7 udp发送数据的流程 8 1,创建套接字,socket模块的socket类,返回一个套接字对象 9 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 10 2,发送数据,调用udp_socket的 sendto方法 11 udp_socket.sendto(b'asdasd',('192.168.1.5',9090)) (参数1为字节类型,参数二为元祖类型(ip,port)) 12 3,关闭套接字 13 udp_socket.close() 14 15 16 """ 17 18 19 def main(): 20 # 创建套接字 21 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 22 while True: 23 send_data = input('输入要发送的数据') 24 25 if send_data == 'exit': 26 break 27 # 收发数据 sendto 方法,发送ip及发送端口 28 # udp_socket.sendto('要发送的数据',对方ip以及port 元祖类型) 29 #udp_socket.sendto(b'的是是',('192.168.1.5',9090)) 字节编码 30 udp_socket.sendto(send_data.encode('gbk'),('192.168.1.5',9090)) # 字符串属性的解码方法('utf-8') 31 # 关闭套接字 32 udp_socket.close() 33 if __name__ == '__main__': 34 main()
接收数据流程如下
1 import socket 2 """ 3 """ 4 """ 5 接收消息与发送消息不同,接收消息需要绑定接收消息的ip与端口 6 流程如下: 7 创建套接字 8 绑定本机ip及端口 9 接收消息 10 关闭套接字 11 12 编码 encode() 13 解码 decode() 14 """ 15 def main(): 16 # 创建套接字 17 udp_receive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 18 # 绑定本机ip及端口,端口与发送机器的发送端口一致 19 # 使用socket对象的bind方法,参数为元祖 20 21 while True: # 循环接收 22 local_addr = ("192.168.1.5", 9091) 23 udp_receive.bind(local_addr) 24 # 接收消息,类型为元祖类型,(数据(ip,port)) 25 recv_data = udp_receive.recvfrom(1024) 26 # 打印数据,元祖取值,进行解码为gbk 27 print(recv_data[0].decode('gbk')) 28 29 # 关闭套接字 30 udp_receive.close() 31 32 if __name__ == '__main__': 33 main()
Udp聊天器代码
1 import socket 2 3 # 创建套接字 4 5 udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 6 # 绑定ip 7 udp_sock.bind(('192.168.1.8', 9091)) 8 while True: 9 send_data = input('输入要发送的数据') 10 # 发数据 11 udp_sock.sendto(send_data.encode('gbk'),('192.168.1.8',9090)) 12 # 收数据,返回元祖,接收数据大小1024 13 res_data = udp_sock.recvfrom(1024) 14 # 打印数据 15 print(res_data[0].decode('gbk')) 16 17 # 关闭套接字 18 udp_sock.close()
tcp发送流程
tcp与udp不同,tcp采用服务器客户端模式,也就是说,客户端都是围绕服务器进行的,tcp消息传送步骤分为客户端与服务器流程如下
客户端
1,创建tcp套接字
2,连接服务器 connect()
3,发送消息,send()
4,关闭套接字
1 import socket 2 "" 3 """ 4 tcp发送数据流程 udp用(SOCK_DGRAM),tcp用(SOCK_STREAM) 5 创建TCP套接字 6 链接服务器,connect((ip,端口))/服务器的ip以及端口 7 发送数据 send/recv ,"udp是sendto/recvfrom" 8 关闭套接字 9 """ 10 # 创建tcp套接字 (socket.AF_INET,socket.SOCK_STREAM) 11 tcp_data = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 12 13 # 链接服务器 14 server_ip = input('请输入服务器ip地址') 15 server_port=int(input('请输入服务器端口号')) 16 server_info = (server_ip,server_port) 17 tcp_data.connect(server_info) 18 while True: 19 # 发送数据 20 send_msg= input('请输入需要发送的数据') 21 if send_msg =='exit': 22 break 23 tcp_data.send(send_msg.encode('gbk')) 24 25 # 关闭套接字 26 tcp_data.close()
服务端
1,创建套接字
2,绑定服务器ip及端口 blind(元祖,服务器ip,地址)
3,设置监听模式,套接字由主动改为被动 listen(数字)
4,返回连接客户端数据,accecp()返回值,元组类型(新套接字,客户端ip及port)
5, recive/send 等操作
6,关闭客户套接字
7,关闭总套接字
1 # Learner BM 2 import socket 3 """""" 4 """ 5 1,创建套接字 6 2,绑定ip以及端口,用于与客户端通信 7 3,listen ,套接字变成被动链接,套接字默认为主动链接出去,改为由主动链接出去,改为接收别人链接 8 4,acceot,等等客户端链接,返回元祖包含档次服务子套接字(新套接字及客户ip) 9 5,recv/send/收发数据 10 """ 11 # 1,创建套接字 12 #tcp_data = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 13 tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 14 15 # 2,绑定ip以及端口 16 17 tcp_server.bind(('192.168.1.8 ' ,7890)) 18 # 3,主动改被动.listen方法 19 tcp_server.listen(48) 20 while True: # 循环链接单次客户 21 # 监听客户,指定一个socket为本次进行服务 22 client_socket,clint_info=tcp_server.accept() 23 print('一个新的客户已链接') 24 25 while True: # 为单个客户循环服务 26 # send_data = input('请输入要发送的消息') 27 # 接收客户信息,调用recv方法,不是recvfrom方法() 28 recevie = client_socket.recv(1024) 29 print('客户发来的信息是 %s' % recevie.decode('gbk')) 30 # 返回客户信息,服务端用send,客户端用sendto 31 if recevie: # 返回值为空时,break 32 re_receive = client_socket.send('aaa'.encode('gbk')) 33 else: 34 break 35 #关闭套接字子套接字,代表当次链接终止 36 client_socket.close() 37 print('当前链接已关闭,等待新的链接') 38 # 关闭总(监听)套接字,关闭此套接字代表整个套接字终止 39 tcp_server.close()
浙公网安备 33010602011771号