python:网络编程(udp 和 tcp)
一、udp
1、发送数据
# 发送数据 from socket import * # 创建udp套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 接收方的地址 dest_addr = ('192.168.0.109', 8080) # 要发送的数据 # send_data = 'hi~' send_data = input('请输入你要发送的数据:') # 发送数据到指定的电脑上的指定程序中 udp_socket.sendto(send_data.encode('utf-8'), dest_addr) # 关闭套接字 udp_socket.close()
2、循环发送数据
# 发送数据 from socket import * # 创建udp套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 接收方的地址 dest_addr = ('127.0.0.1', 8080) while True: # 要发送的数据 # send_data = 'hi~' send_data = input('请输入你要发送的数据:') # 发送数据到指定的电脑上的指定程序中 udp_socket.sendto(send_data.encode('utf-8'), dest_addr) # 关闭套接字 udp_socket.close()
3、接收数据
from socket import * # 创建套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 绑定本地信息 localaddr = ('', 8080) udp_socket.bind(localaddr) print('等待接收数据中....') # 接收数据 # 1024:表示本次接收的最大字节数 recv_data = udp_socket.recvfrom(1024) recv_msg = recv_data[0] from_addr = recv_data[1] print('来自{}的信息:{}'.format(str(from_addr), recv_msg.decode('gbk'))) # 关闭套接字 udp_socket.close() print('Done.')
4、循环接收数据
from socket import * # 创建套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 绑定本地信息 localaddr = ('', 8080) udp_socket.bind(localaddr) while True: print('等待接收数据中....') # 接收数据 # 1024:表示本次接收的最大字节数 recv_data = udp_socket.recvfrom(1024) recv_msg = recv_data[0] from_addr = recv_data[1] print('来自{}的信息:{}'.format(str(from_addr), recv_msg.decode('gbk'))) # 关闭套接字 udp_socket.close() print('Done.')
二、tcp
1、客户端
from socket import * # 1.创建套接字 tcp_socket = socket(AF_INET, SOCK_STREAM) # 2.链接服务器 server_ip = '192.168.0.108' server_port = 8899 server_addr = (server_ip, server_port) tcp_socket.connect(server_addr) # 3.发送数据 send_data = input('请输入你要发送的数据:') tcp_socket.send(send_data.encode('utf-8')) # 4.关闭套接字 tcp_socket.close()
2、服务器
from socket import * # 创建套接字 tcp_server_socket = socket(AF_INET, SOCK_STREAM) # 绑定本地信息 addr = ('', 8899) tcp_server_socket.bind(addr) # 让套接字由主动变为被动 tcp_server_socket.listen(128) # 等待客户端链接 print('-'*10 + '等待客户端链接' + '-'*10) new_client_sock, client_addr = tcp_server_socket.accept() print('-'*10 + '客户端' + str(client_addr) + '已连接上了' + '-'*10) # 接收客户端发送过来的数据 recv_data = new_client_sock.recv(1024) # 最多接收 1024 个字节 print('接收到的数据为:{}'.format(recv_data.decode('utf-8'))) # 回送一部分数据给客户端 new_client_sock.send('Success.'.encode('utf-8')) # 关闭套接字 new_client_sock.close() tcp_server_socket.close()
3、循环-服务器
from socket import * # 创建套接字 tcp_server_socket = socket(AF_INET, SOCK_STREAM) # 绑定本地信息 addr = ('', 8899) tcp_server_socket.bind(addr) # 让套接字由主动变为被动 tcp_server_socket.listen(128) while True: # 等待客户端链接 print('-'*10 + '等待客户端链接' + '-'*10) new_client_sock, client_addr = tcp_server_socket.accept() print('-'*10 + '客户端' + str(client_addr) + '已连接上了' + '-'*10) # 接收客户端发送过来的数据 recv_data = new_client_sock.recv(1024) # 最多接收 1024 个字节 print('接收到的数据为:{}'.format(recv_data.decode('utf-8'))) # 回送一部分数据给客户端 new_client_sock.send('Success.'.encode('utf-8')) # 关闭套接字 new_client_sock.close() tcp_server_socket.close()
4、循环2-服务器
from socket import * # 创建套接字 tcp_server_socket = socket(AF_INET, SOCK_STREAM) # 绑定本地信息 addr = ('', 8899) tcp_server_socket.bind(addr) # 让套接字由主动变为被动 tcp_server_socket.listen(128) while True: # 等待客户端链接 print('-'*10 + '等待客户端链接' + '-'*10) new_client_sock, client_addr = tcp_server_socket.accept() print('-'*10 + '客户端' + str(client_addr) + '已连接上了' + '-'*10) while True: # 循环,一直为这个客户端服务,知道客户端关闭连接为止 # 接收客户端发送过来的数据 recv_data = new_client_sock.recv(1024) # 最多接收 1024 个字节 if recv_data: print('接收到的数据为:{}'.format(recv_data.decode('utf-8'))) # 回送一部分数据给客户端 new_client_sock.send('Success.'.encode('utf-8')) else: print('客户端{}已关闭连接.'.format(str(client_addr))) break # 关闭套接字 new_client_sock.close() tcp_server_socket.close()
5、文件下载器:
服务器:
from socket import * def get_file_content(filename): try: with open(filename, 'rb') as f: content = f.read() return content except: print('没有该文件信息:' + filename) def main(): # 创建套接字 tcp_server_socket = socket(AF_INET, SOCK_STREAM) # 绑定本地信息 addr = ('', 8899) tcp_server_socket.bind(addr) # 将主动套接字变为被动套接字 tcp_server_socket.listen(128) while True: print('-'*10 + "等待客户端链接" + '-'*10) # 等待客户端连接 new_client_socket, client_addr = tcp_server_socket.accept() print('-'*10 + "客户端" + str(client_addr) + "已连接" + '-'*10) # 接收对方发过来的数据 recv_data = new_client_socket.recv(1024) # 数据为文件名称 filename = recv_data.decode('utf-8') print('客户端请求下载的文件名为:' + filename) # 获取文件内容 file_content = get_file_content(filename) # 因为获取打开文件时是以rb方式打开,所以file_content中的数据已经是二进制的格式,因此不需要encode编码 if file_content: # 把数据发送给客户端 new_client_socket.send(file_content) # 关闭客户端 new_client_socket.close() # 关闭tcp 套接字 tcp_server_socket.close() if __name__ == '__main__': main()
客户端:
from socket import * def main(): # 创建套接字 tcp_client_socket = socket(AF_INET, SOCK_STREAM) # 链接服务器 addr = ('192.168.0.108', 8899) tcp_client_socket.connect(addr) # 获取要下载的文件名 filename = input('请输入你要下载的文件名:') # 发送文件下载请求 tcp_client_socket.send(filename.encode('utf-8')) # 接收服务器返回的数据 # 接收的数据是二进制的格式,不需要decode转码 recv_data = tcp_client_socket.recv(1024) if recv_data: with open('[接收]' + filename, 'wb') as f: f.write(recv_data) else: print('服务器没有找到相关的文件!') # 关闭套接字 tcp_client_socket.close() if __name__ == '__main__': main()