5、网络编程-udp聊天器(1)

套接字可以同时收发数据
单工:只能指向一个方向,收音机
半双工:对讲机,收发都能进行,但不能同时进行
全双工:同一时刻既可以收也可以发,手机

socket套接字是全双工,本程序中没有体现出来,后面学习多任务后,同一时刻可做很多事情

首先在终端中查看前面已经创建的文件,命令:
ls:查看当前目录下的文件
tree 文件名:查看改文件下的目录

5、网络编程-udp聊天器(1)_第1张图片

把python-03文件夹下的02文件复制到pyhton-04文件夹下:
cp python-03/ 02发送任意数据给windows中调试助手.py python-04/

然后cd到python-04中,ls查看刚才复制的文件已经过来了,给文件改名字:
mv 02发送任意数据给windows中调试助手.py 01 使用同一个套接字收发数据.py

原代码中对方的ip和端口都是固定的,现在改成自动获取。

注意:
input获取的内容都是字符串,获取端口时需要的是数字,不是字符串,所以需要int转化 #但是如果输入时不是数字,而是字母,用int转化就会崩掉,所以需要用try捕获异常,在 dest_port =int( input(“请输入对方的port:”))代码前加一个try

命令:vim中快速跳转到某行
无论光标在哪,vim编辑时快速跳到某一行的命令,Esc进入命令模式,先敲数字,即想跳转的那行的行号,没有任何反应,然后按大写的G,光标快速到达改行行首。yyp复制该行,再转换成编辑模式,把刚刚那行代码注释掉

命令:快速到光标所在行的行末和行首
Esc,大A,而且是编辑模式,大写的I跳到改行行首
从命令模式到编辑模式,除了按i还可以按A

import socket
def main():
    #创建一个udp套接字
    udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
	#获取对方的ip和port
	dest_ip = input("请输入对方的ip:")
	dest_port =int( input("请输入对方的port:"))
    
    #从键盘获取数据,就可以实现发送任意数据了,并用send_data变量存储,
    send_data = input(“请输入你要发的信息:”)
    
    #可以使用套接字收发数据,此处就不能在变量前加b了,把这句代码变成注释,yy p复制这句代码,重新编辑
    #udp_socket.sendto(b“hahahah”,(“192.168.33.53”,8080))
    #input获取的东西是以字符串存储的,不能直接把b“hahahah”换成send_data,用encode(“utf-8”)方法  
   # udp_socket.sendto(send_data.encode(“utf-8”),(“192.168.33.53”,8080))
     udp_socket.sendto(send_data.encode(“utf-8”),(deset_ip,deset_port))
    
    #关闭套接字
    udp_socket.close()
    
if__name__=”__main__”:
 main()

程序补完对方的任意的ip和端口后,先进行测试再完成既能收又能发的功能
本次测试在ubantu中的网络测试助手中进行测试
网络通信不仅可以在不同电脑间进行,也可以在同一台电脑中的不同程序中进行。
本次ubantu终端中config后出现两个ip 第一个是192.168.33.109 第二个lo 的ip127.0.0.1,
每次填对方的ip时不用每次都config,直接填固定的ip127.0.0.1即可,但是ip127.0.0.1不能用于网络通信,每个人的电脑上都有一个ip127.0.0.1,但是同一台电脑不同程序间通信可以写ip127.0.0.1

命令:新开一个终端标签
ctrl+shift+t

完成收数据的功能

import socket
def main():
    #创建一个udp套接字
    udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
	#获取对方的ip和port
	dest_ip = input("请输入对方的ip:")
	dest_port =int( input("请输入对方的port:"))
    
    #从键盘获取数据,就可以实现发送任意数据了,并用send_data变量存储,
    send_data = input(“请输入你要发的信息:”)
    
    #可以使用套接字收发数据,此处就不能在变量前加b了,把这句代码变成注释,yy p复制这句代码,重新编辑
    #udp_socket.sendto(b“hahahah”,(“192.168.33.53”,8080))
    #input获取的东西是以字符串存储的,不能直接把b“hahahah”换成send_data,用encode(“utf-8”)方法  
   # udp_socket.sendto(send_data.encode(“utf-8”),(“192.168.33.53”,8080))
     udp_socket.sendto(send_data.encode(“utf-8”),(deset_ip,deset_port))
    
    #接受回送过来的数据,并用recv_data变量接收
    recv_data =  udp_socket.recvfrom(1024)
    print(recv_data)
    #关闭套接字
    udp_socket.close()
    
if__name__=”__main__”:
 main()

当udp_socket.recvfrom没有数据到来的时候,程序会卡在那,即阻塞。

你可能感兴趣的:(网络编程)