udp发送数据
发送数据流程
1.创建socket
2.发送数据
3.关闭
创建一个发送数据客户端
import socket
def clientSocket():
#1. found
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2.bind port
local_addr = ("",7890)
udp_socket.bind(local_addr)
while True:
# send data
send_data = input("please input send data:")
if send_data=="exit":
break
# use
udp_socket.sendto(send_data.encode("utf-8"),("192.168.147.145",7788))
# resource
udp_socket.close()
if __name__ == "__main__":
clientSocket()
接收udp数据
编码encode(“utf8”)把字符串转化为byte类型
解码decode(“utf8”)把byte类型转化回字符串类型
接收数据流程
1.创建socket
2.绑定本地自己的信息(ipheport)
3.接收数据
4.关闭
创建一个接收数据的服务端
import socket
def severSocket():
# 1.found
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2.bind
local_addr = ('192.168.147.145',7788)
udp_socket.bind(local_addr)
while True:
# accept
revc_data = udp_socket.recvfrom(1024)
# show =>(data,(ip,port))
print(revc_data[0].decode("utf-8"))
# resource
udp_socket.close()
if __name__ == '__main__':
severSocket()
udp聊天室实现
ctrl+shift+t 可以在終端在开一个端口
recvfrom()等待接收数据,是一个阻塞等待接收状态
socket可以同时收发
import socket
def send_data(udp_socket):
# send data
send_data = input("please input send data:")
udp_socket.sendto(send_data.encode("utf-8"), ("127.0.0.1", 7788))
def accept_data(udp_socket):
# accept data
recv_data = udp_socket.recvfrom(1024)
print(recv_data[0].decode("utf-8"))
def main():
# found socket
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# bind
udp_socket.bind(("127.0.0.1",8899))
while True:
user = int(input("please input function"))
if user==1:
send_data(udp_socket)
elif user==2:
accept_data(udp_socket)
# resource
udp_socket.close()
if __name__ == "__main__":
main()
TCP客户端
udp不区分,但是TCP严格区分客户端,服务端
1.买个手机(创建socket)
2.插入手机卡(绑定bind)
3.将手机设为响铃模式(listen)
4.等待别人电话打进来(accept)
服务端
import socket
def main():
# 1.
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.
tcp_server.bind(("127.0.0.1",8566))
# 3.
tcp_server.listen(128)
# 4.
while True:
client_socket,clientAddr = tcp_server.accept()
while True:
# 接收客户端发送的请求
recv_data = client_socket.recv(1024)
print(recv_data.decode("utf-8"))
if not recv_data:
# 回送一部分数据给客户端
client_socket.send("hhaha".encode("utf-8"))
# 关闭
client_socket.close()
tcp_server.close()
if __name__ == '__main__':
main()
客户端
import socket
def main():
# found socket
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# link sever
sever_ip = input("please input link ip")
sever_port = int(input("please input link port"))
tcp_socket.connect((sever_ip,sever_port))
# send data
send_data=input("please input send data")
tcp_socket.send(send_data.encode("utf-8"))
# realease
tcp_socket.close()
if __name__ == "__main__":
main()
文件下载实现
1024–>1K
1024*1024–>1M
服务端
import socket
def send_file_2_cilent(client_socket):
# 接收客户端发送的下载请求
file_name = client_socket.recv(1024).decode("utf-8")
print("客户端需要下载的{}这个文件".format(file_name))
try:
f = open(file_name,"rb")
file_content = f.read()
except Exception as e:
print(e)
finally:
f.close()
client_socket.send(file_content)
def main():
# 1.
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.
tcp_server.bind(("",8866))
# 3.
tcp_server.listen(128)
client_socket,clientAddr = tcp_server.accept()
send_file_2_cilent(client_socket)
# 关闭
client_socket.close()
tcp_server.close()
if __name__ == '__main__':
main()
客户端
import socket
def main():
# found socket
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sever_ip = input("please input link ip")
sever_port = int(input("please input link port"))
# 链接服务器
tcp_socket.connect((sever_ip,sever_port))
# 输入下载文件名称
file_name = input("请输入你要下载的文件名称")
tcp_socket.send(file_name.encode("utf-8"))
# 接收对发传回来的数据
recv_data=tcp_socket.recv(1024*1024)
if recv_data:
with open("接收"+file_name,"wb") as f:
f.write(recv_data)
# realease
tcp_socket.close()
if __name__ == "__main__":
main()