socket 通信(UDP/TCP)

udp:

一:udp 发送数据

如果只是发送数据的话,没必要绑定端口(其实操作系统会给随机分配个端口),只需要知道对方的ip 和port 就可以了,用sendto发送即可!

 1 from socket import *
 2 
 3 def main():
 4     udp_socket  =  socket(AF_INET,SOCK_DGRAM)
 5 
 6     while True:
 7         send_data = input("请输入要发送的内容>>>")
 8         if send_data == 'exit':
 9             break
10 
11         addr =("192.168.137.1",8080)
12         udp_socket.sendto(send_data.encode("utf8"),addr)
13         
14     udp_socket.close()
15 
16 if __name__ == '__main__':
17     main()

二:udp 接收数据

但是如果要接收数据,程序就必须得有个固定的端口,这样别人发送的时候才能发送!

 1 from socket import *
 2 
 3 def main():
 4     #创建套接字
 5     udp_socket  =  socket(AF_INET,SOCK_DGRAM)
 6 
 7     #绑定本机一个固定端口,用于接收数据
 8     local_addr = ("",9090)  #空的字符串代表本机任何一个ip
 9     udp_socket.bind(local_addr)
10 
11     #接收数据  recv_data 收到的既有内容还有  对方的ip +port 
12     recv_data = udp_socket.recvfrom(1024)#一次最多接收1024字节 ,如果收不到会在这阻塞。
13     print(recv_data)  #(b'hello world', ('192.168.137.1', 8080))
14                       #意思是收到了192.168.137.1 中8080 端口发来的数据
15 
16 
17     #关闭套接字
18     udp_socket.close()
19 
20 if __name__ == '__main__':
21     main()

三:udp 发送和接收:

服务端:

 1 from socket import *
 2 
 3 def main():
 4     #创建套接字
 5     udp_socket  =  socket(AF_INET,SOCK_DGRAM)
 6 
 7     #绑定本机一个固定端口,用于接收数据
 8     local_addr = ("",9090)  #空的字符串代表本机任何一个ip
 9     udp_socket.bind(local_addr)
10 
11     while True:
12         #接收数据  recv_data 收到的既有内容还有  对方的ip +port
13         recv_data = udp_socket.recvfrom(1024)#一次最多接收1024字节
14         print("收到数据:",recv_data[0].decode("gbk"))  #之所以用gbk是因为对面用的是 ,windows默认用gbk 编码
15         print("对方的ip,port: ",recv_data[1])
16         c_ip_port = recv_data[1]  #是个元组
17 
18         send_data = "滚一边去,老子没空"
19         udp_socket.sendto(send_data.encode("gbk"),c_ip_port)
20 
21     #关闭套接字
22     udp_socket.close()
23 
24 if __name__ == '__main__':
25     main()

注:可以用tcp/udp 调试工具来模拟客户端

udp小案例:udp 聊天器:

通过网络不仅可以不同电脑通信,同一台电脑也可以通信:

每个电脑都有一个127.0.0.1  ,它是不变的,可以用于本机两个进程间的通信!

1,阻塞等待!

单工:收音机(客户端只能接受数据)

半双工:对讲机(在收的时候发不了,发的时候收不了)

全双工:打电话(在收的时候也能发)

2,socket 是全双工!

 

TCP (重点):

一:tcp服务端

 1 from socket import *
 2 
 3 def main():
 4     #创建套接字
 5     tcp_socket = socket(AF_INET,SOCK_STREAM)
 6     #绑定固定端口
 7     tcp_socket.bind(("",9090))
 8 
 9     #设置最大监听数
10     tcp_socket.listen(128)  #最大监听数设置为128
11     #accept()获得客户端的ip 和端口
12     while True:
13         new_socket,c_addr = tcp_socket.accept()
14         print(c_addr)
15         #通信
16         while True:
17             recv_data = new_socket.recv(1024)
18             print(recv_data.decode("gbk"))
19 
20             if recv_data:
21                 send_data = input("请输入(to client)>>>")
22                 new_socket.send(send_data.encode("gbk"))
23             else:
24                 break  #使用它来退出循环
25 
26         new_socket.close()  #关闭用于通信的套接字
27 
28     #关闭套接字
29     tcp_socket.close()
30 
31 
32 if __name__ == '__main__':
33     main()
版本一:这在Linux平台是没错的

但是,在win 平台上面,老是会抛出异常,所以,我们要用异常去捕捉它,并利用异常退出循环

 1 from socket import *
 2 
 3 def main():
 4     #创建套接字
 5     tcp_socket = socket(AF_INET,SOCK_STREAM)
 6     #绑定固定端口
 7     tcp_socket.bind(("",9090))
 8 
 9     #设置最大监听数
10     tcp_socket.listen(128)  #最大监听数设置为128
11     #accept()获得客户端的ip 和端口
12     while True:
13         new_socket,c_addr = tcp_socket.accept()
14         print(c_addr)
15         #通信
16         while True:
17             try:
18                 recv_data = new_socket.recv(1024)
19                 print(recv_data.decode("gbk"))
20 
21                 send_data = input("请输入(to client)>>>")
22                 new_socket.send(send_data.encode("gbk"))
23             except:
24                 break
25         new_socket.close()  #关闭用于通信的套接字
26 
27     #关闭套接字
28     tcp_socket.close()
29 
30 
31 if __name__ == '__main__':
32     main()
版本二:(win),利用异常退出里层循环

二:tcp客户端:

 1 from socket import *
 2 
 3 def main():
 4     #建立soket套接字
 5     tcp_socket = socket(AF_INET,SOCK_STREAM)
 6 
 7     #connect() 连接服务器
 8     s_ip = "192.168.137.1"
 9     s_port = 9090
10     tcp_socket.connect((s_ip,s_port))
11 
12     #通信
13     while True:
14         send_data = input("请输入要输入的内容(to server)>>>")
15         tcp_socket.send(send_data.encode("gbk"))
16 
17         recv_data= tcp_socket.recv(1024) #每次收1024字节
18         print(recv_data.decode("gbk"))
19 
20     #断开连接
21     tcp_socket.close()
22 
23 if __name__ == '__main__':
24     main()
tcp_client

三:tcp案例:下载文件

pass 

猜你喜欢

转载自www.cnblogs.com/zach0812/p/11339285.html