tcp 互相发送消息 与 下载文件

互相发送消息(我使用的是自己给自己发消息 改变主机名 与端口号 可实现不同主机之间通信)

客户端:

# -*- coding: utf-8 -*-   
from socket import *  
  
HOST = 'localhost'          #主机名  
PORT =  9999               #端口号 与服务器一致  
BUFSIZE = 1024              #缓冲区大小1K  
ADDR = (HOST,PORT)  
  
tcpCliSock = socket(AF_INET, SOCK_STREAM)  
tcpCliSock.connect(ADDR)    #连接服务器  
  
while True:                 #无限循环等待连接到来  
    try:  
        data = raw_input('Client')  
        if not data:  
            break  
        tcpCliSock.send(data)            #发送数据
        
        data = tcpCliSock.recv(BUFSIZE)  #接受数据  
        if not data:  
            break  
        print 'Server: ', data  
    except Exception,e:  
        print 'Error: ',e  
          
tcpCliSock.close()          #关闭客户端  

 

服务器端:

# -*- coding: utf-8 -*-   
from socket import *  
from time import ctime  
  
HOST = 'localhost'          #主机名  
PORT =  9999               #端口号  
BUFSIZE = 1024              #缓冲区大小1K  
ADDR = (HOST,PORT)  
  
tcpSerSock = socket(AF_INET, SOCK_STREAM)  
tcpSerSock.bind(ADDR)       #绑定地址到套接字  
tcpSerSock.listen(5)        #监听 最多同时5个连接进来  
  
while True:                 #无限循环等待连接到来  
    try:  
        print 'Waiting for connection ....'  
        tcpCliSock, addr = tcpSerSock.accept()  #被动接受客户端连接  
        #print u'Connected client from : ', addr  
  
        while True:  
            data = tcpCliSock.recv(BUFSIZE)     #接受数据  
            if not data:  
                break  
            else:  
                print 'Client: ',data
            ss=raw_input('Server')
            tcpCliSock.send(ss)  
  
    except Exception,e:  
        print 'Error: ',e  
tcpSerSock.close()          #关闭服务器  


tcp下载文件(我使用的是本机 与 阿里云服务器):

 

客户端:

# -*- coding: cp936 -*-
import socket
 
if __name__ == '__main__':
    # 创建套接字,AF_INET:ipv4,SOCK_STREAM:TCP协议
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 和服务端连接
    tcp_client_socket.connect(("服务器ip地址", 5555))
    # 发送下载文件的请求
    file_name = 'cs.txt'
    # 个人在服务端和客户端都采用utf-8编码
    file_name_data = file_name.encode("utf-8")
    # 发送请求数据
    tcp_client_socket.send(file_name_data)
    # 把数据写入到文件里
    with open("C:/Users/Administrator/Desktop/" + file_name, "a+") as file:
        while True:
            # 循环接收文件数据
            file_data = tcp_client_socket.recv(1024)
            # 只要接收到数据,就写入
            if file_data:
                file.write(file_data)
            else:
                print("服务端把数据发送完成并关闭了连接")
                break
    # 关闭套接字
    tcp_client_socket.close()


服务器:

# -*- coding: utf-8 -*-
import socket
import os
 
 
if __name__ == '__main__':
 
    # 在这里我将os.path的默认路径进行了更改,改到了桌面
    os.chdir("C:/study/class/")
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定端口号,ip地址不绑定
    tcp_server_socket.bind(("", 5555))
    # 程序结束,释放端口号,端口号复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 设置监听,把主动套接字变成被动套接字,服务端套接字只负责接收客户端的连接请求
    tcp_server_socket.listen(128)
    while True:
        service_client_socket, ip_port = tcp_server_socket.accept()
        print("客户端连接成功了:", ip_port)
        # 接收客户端的请求信息
        file_name_data = service_client_socket.recv(1024)
        # 对二进制数据进行解码
        file_name = file_name_data.decode("utf-8")
        print(file_name)
        # 判断文件是否存在
        if os.path.exists(file_name):
            # 文件存在
            with open(file_name, "rb") as file:
                # 读取文件数据
                while True:
                    # 循环读取文件数据
                    file_data = file.read(1024)
                    #表示读到数据
                    if file_data:
                        # 然后把数据发送给客户端
                        service_client_socket.send(file_data)
                    else:
                        print("请求的文件数据发送完成")
                        break
        else:
            print("您请求下载的文件不存在")
        # 终止和这个客户端服务
        service_client_socket.close()
        # 终止客户端连接请求服务, 服务端的套接字可以不用关闭
        tcp_server_socket.close()

 

服务器端需要在指定目录下 写该文件,客户端不用先新建(使用的a+)

先运行服务器,再运行客户端

传输成功的显示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Boost.Asio库来实现两台电脑之间的连接和消息传输。下面是一个简单的示例代码,演示了如何使用Boost.Asio建立TCP连接并发送消息: ```cpp #include <iostream> #include <boost/asio.hpp> using boost::asio::ip::tcp; int main() { try { // 创建IO服务对象 boost::asio::io_service io_service; // 创建一个TCP socket对象 tcp::socket socket(io_service); // 连接到服务器 tcp::resolver resolver(io_service); tcp::resolver::query query("localhost", "8080"); // 修改为服务器的IP地址和端口号 tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); boost::asio::connect(socket, endpoint_iterator); // 发送消息 std::string message = "Hello, server!"; boost::asio::write(socket, boost::asio::buffer(message)); // 接收服务器的响应 char buffer[1024]; size_t len = socket.read_some(boost::asio::buffer(buffer)); std::cout << "Received response: "; std::cout.write(buffer, len); std::cout << std::endl; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } return 0; } ``` 上述代码中,我们创建了一个Boost.Asio的io_service对象,它用于驱动异步操作。然后创建了一个TCP socket对象,并使用resolver对象解析服务器的地址和端口号。接下来,使用connect函数连接到服务器。发送消息使用write函数,接收服务器的响应使用read_some函数。 注意:上述代码只是一个简单的示例,实际应用中可能需要处理更多的错误和异常情况,以及使用异步操作来提高性能。 你可以将上述代码编译为可执行文件,并在两台电脑上分别运行,即可实现两台电脑之间的连接和消息传输。记得将代码中的服务器地址和端口号修改为实际使用的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值