一:说明
1:在一个电脑中编写一个程序,有两个功能1:获取键盘的数据,并且发送给对方。2:接受数据显示 。并且功能数据进行选择以上的两个功能调用。
问题:
1:一个套接字能不能同时收并且发数据?

import socket

def main():
	# 创建套接字
	udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	# 对方的IP
	dest_ip = input("请输入对方的IP: ")
	# 对方的端口
	dest_port = 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()
	
if __name__ == "__main__":
	main()

这个案例说明了,一个套接字既可以发数据也可以接收数据。

二:单工,半双工,全双工。

单工:只能收。
半双工:可以收发,但是收的时候发不了,发的时候收不了。(对讲机)
全双工:同时可以收和发。

注意:socket是全双工的,因为他收的时候也可以发,发数据的时候也可以接收。

三:UDP聊天器
根据我们的构想,可以先打一个这样的代码:
网络编程---UDP聊天器_应用程序
这个存在的问题:只有我发一个消息,对方回复了,才能再次发送一个消息,也就是必须等待对方回复才可以再发送。(此时是半双工的),以后学了多任务后可以同时进行收发。
下面是对上面代码的改进。
网络编程---UDP聊天器_ubuntu_02
但是我们会发现一个问题,当我使用别的机器向ubuntu发送一个数据的时候比如:aaa,我点击接受数据,会受到aaa,再次点击又会受到aaa???

解释:
情况一:
当应用程序调用了recvfrom,os未接受到信息,则recvfrom进入阻塞状态,等到接受到信息,recvfrom才进入执行状态。
情况二:
当os接收到信息,而应用程序没有调用recvfrom,此时os会临时保存,等应用程序调用recvfrom是内存释放。

BUG:只要知道对方电脑正在开的端口,向对方电脑发送超过内存容量的信息,对方电脑就会死机。