本集学习网络编程的基础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()
View Code

接收数据流程如下

 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()
View Code

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()
View Code

 

 

 

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()
View Code

 

服务端

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()
View Code

 

posted on 2020-03-22 19:42  RRRRRRR1  阅读(9)  评论(0)    收藏  举报