网络通信/socket/udp/tcp–图片传输问题及通信操作
1.udp简单聊天器代码:
通信较为简单,不安全,作为发送端口可以不绑定IP
import socket
import time
port = 10010
def interface():
print("******欢迎来到 udp 不完全聊天器******")
print("发送数据请输入 1")
print("接收数据请输入 2")
print("退出请输入 0")
#接收函数
def recv_fun(udp_socket):
recv_data = udp_socket.recvfrom(1024)
#explain data
data = recv_data[0].decode("utf-8")
addr = str(recv_data[1])
print("%s:%s" % (addr,data))
def send_fun(udp_socket):
port = int(input("请输入需要发送到的端口:"))
send_data = input("请输入发送的数据:")
udp_socket.sendto(send_data.encode("utf-8"),("127.0.0.1",port))
#receive data
def main():
#1.creat socket
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#2.bind information
# ''is myself information
#local_addr = ('127.0.0.1',10010)
port = int(input("请输入绑定的端口:"))
local_addr = ('',port)
udp_socket.bind(local_addr)
while(True):
interface()
mode = input("请选择模式:")
if(mode == '1'):
send_fun(udp_socket)
elif(mode == '2'):
recv_fun(udp_socket)
elif(mode == '0'):
print("退出")
break
else:
print("输入错误,请重新输入")
#5.close socket
udp_socket.close()
if __name__ == '__main__':
main()
2.TCP文件下载器:
通信安全可靠,作为服务器需要绑定,作为客户端可以不绑定。
在传输图片的时候,因为图片二进制的原因,所以,在打开图片文件的时候,是需要以二进制的模式打开的,而传输的时候可以不向平常一样用“”utf-8“”的方式传输。经过测量,其它文件也可以用二进制的方式去打开,传输。
serive服务器代码:
import socket
#在二进制文件传输中,如,图片这一类型的数据, python中的文件需要用不同类型的方式去打开这个文件
#否则会出现,传输拒绝等错误,用二进制的方式打开,可以直接传输,不需要用utf-8的方式
def send_fun(new_client_socket):
#1.接受文件名
recv_data = new_client_socket.recv(1024)
filename = recv_data.decode("utf-8")
print(filename)
#2.打开指定
fd = open(filename,'rb+')
print("open ok")
#file_size =
while(True):
text = fd.readline()
if not text:
break
new_client_socket.send(text)
#new_client_socket.send(text.encode("utf-8"))
fd.close()
#TCP 严格区分服务器,客户端,而UDP不用
def main():
#1.创建TCP 套接字,
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#2.绑定ip
tcp_id = ("127.0.0.1",8082)
tcp_socket.bind(tcp_id)
#3.监听客户端
tcp_socket.listen(128)
#4.等待客户端链接
new_client_socket,client_addr = tcp_socket.accept()
print(client_addr)
#5.接收与发送文件需求
send_fun(new_client_socket)
#6.关闭服务器
tcp_socket.close()
new_client_socket.close()
if __name__ == '__main__':
main()
tcb客户端代码:
import socket
#循环接受数据的函数
def recv_fun(tcp_socket,name):
#1.先打开创建一个文件
#fd = open(name,"w")
fd = open(name,"wb+")
#3.循环接收数据,并且保存到文件里面
while(True):
recv_data = tcp_socket.recv(1024)
#fd.write(recv_data.decode("gb2312"))
fd.write(recv_data)
if not recv_data:
break
fd.close()
#TCP 严格区分服务器,客户端,而UDP不用
def main():
#1.创建TCP 套接字,
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#2.链接服务器
tcp_socket.connect(("127.0.0.1", 8082))
#3.获取下载文件的名字
download_filename = input("请输入下载文件的名字: ")
new_filename = input("请输入新文件的名字")
#4.将文件名发送到服务器
tcp_socket.send(download_filename.encode("utf-8"))
#5.接收文件的数据
#6.保存数据到另一个文件中
recv_fun(tcp_socket,new_filename)
#7.关闭套接字
tcp_socket.close()
if __name__ == '__main__':
main()