在写服务端的时候,一定要明白一个事情就是 绑定端口和ip 。
有的人该问了在写发送方的时候,为什么没有写 ip 和端口
解释如下:
发送方的IP 可以是动态的, 是由操作系统自动分配的, 发送方只是客户端,服务器不会关心你的客户端的ip ,只要发送我就接受 。
但是 服务器端 如果不绑定 ip ,当 客户端发送信息的时候,找不到ip 路由,就是达不到你这个机器上,
有个规定 当你不绑定的时候,默认为你本机ip ,如果你绑定其他机器ip 是报错的, 自己可以试试
端口 也是一样 发送方 可以为任意端口,除了常用端口不能用,其他都可以用,也可以是操作系统分配。
但是 服务器 必须固定,否则 找不到这个程序, 在绑定服务器端口的时候 要注意 不能和其他程序重复,否则会启动失败。
模拟 UDP 服务器
先设置 客户端的信息,如下:
编写服务端 , 让他能接受客户端的信息:
from socket import *
udpsocket=socket(AF_INET,SOCK_DGRAM)
bindarr=('',8080)
udpsocket.bind(bindarr) # 服务端绑定 ip 和 端口, 不写ip 默认是本机
print("开始接受信息中.................")
while True:
recedata=udpsocket.recvfrom(1024)
print(recedata)
udpsocket.close()
打印结果为:
开始接受信息中…
(b’i am client ,please server recive’, (‘192.168.43.224’, 8089)) # 元祖里显示的client 的 ip 和端口
(b’i am client ,please server recive’, (‘192.168.43.224’, 8089))
(b’i am client ,please server recive’, (‘192.168.43.224’, 8089))
(b’i am client ,please server recive ', (‘192.168.43.224’, 8089))
(b’i am client ,please server recive ', (‘192.168.43.224’, 8089))
(b’i am client ,please server recive ', (‘192.168.43.224’, 8089))
(b’i am client ,please server recive ', (‘192.168.43.224’, 8089))
(b’i am client ,please server recive ', (‘192.168.43.224’, 8089))
如果想接受 汉字,必须decode 下, 代码改下 :
from socket import *
udpsocket=socket(AF_INET,SOCK_DGRAM)
bindarr=('',8080)
udpsocket.bind(bindarr)
print("开始接受信息中.................")
while True:
recedata, deskinfo=udpsocket.recvfrom(1024) # 由于返回的是元祖,让 recedata 接受返回的数据,
print(recedata.decode("gb2312")) # 由于客户端只是gb2312, 一般要用国际标准 utf-8
udpsocket.close()
随便发送汉字都可以 .
总结: encode 是编码, 在发送的时候能遇到, decode 是解码把一些乱码能转化为咱们看的懂的。
代码优化下 ,请看下边
if __name__=="__main__":
global udpsocket
global ip
global port
ip=input("ip: ")
port=int(input("port: " ))
udpsocket = socket(AF_INET, SOCK_DGRAM)
bindarr = ('', 8080)
udpsocket.bind(bindarr)
print("开始接受信息中.................")
thread1 = Thread(target=receve)
thread2 = Thread(target=send)
thread1.start()
thread2.start()
thread1.join()
thread2.join()