socket_tcp服务端客户端(聊天为例)以及 socket_文件下载实例

话不多说直接上代码
注释已经解释得很清楚了

聊天实例
客户端实现

import socket

def main():
    # 1.创建套接字
    tcp_clinet_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 2.连接服务器
    server_ip = input("请输入连接服务器ip:")
    server_port = int(input("请输入连接服务器port:"))
    server_addr = (server_ip,server_port)
    tcp_clinet_socket.connect(server_addr)
    # 3.收发数据
    
    while True:
        # 发
        send_data = input("请输入要发送的数据:")
        if send_data == "exit":
            break
        tcp_clinet_socket.send(send_data.encode("utf-8"))
        # 收
        recv_data = tcp_clinet_socket.recv(1024)
        print("对方:"+recv_data.decode("utf-8"))
    # 4.关闭套接字
    tcp_clinet_socket.close()
if __name__=="__main__":
    main()

服务端实现

import socket

def main():
    # 1.买个手机(创建套接字)
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 2.插入手机卡(绑定本地信息)
    tcp_server_socket.bind(("",9999))
    # 3.将手机设置为响铃(让默认的套接字有主动变为被动 listen)
    tcp_server_socket.listen(128)
   
    while True:  # 处理多个用户 
        print("++++++++++等待新用户连接++++++++++")
        # 4.等待别人电话到来(等待客户端连接 accept)
        new_clinet_socket,clinet_addr = tcp_server_socket.accept()
        print("++++++++++等待用户发送数据++++++++++")
        print(clinet_addr[0])
        print(new_clinet_socket)
        # 接受客户发来的数据
        
        while True:  # 处理单个用户循环通信(聊天)
            recv_data = new_clinet_socket.recv(1024)
            print("用户%s:%s" % (clinet_addr[0],recv_data.decode("utf-8")))
            
            # 回复客户端

            #  如果recv解堵塞,那么有2种情况:
            #  1.客户端发送数据过来
            #  2.客户端调用close()
            if recv_data:
                Reply_data = input("请回复:")
                new_clinet_socket.send(Reply_data.encode("utf-8"))
            else:
                break

        # 关闭套接字
        new_clinet_socket.close()  # accept套接字 关闭本次服务
    tcp_server_socket.close()  # 监听套接字 关闭  不能再提供服务
if __name__ == "__main__":
    main()

文件下载实例

客户端代码

import socket

def main():
    # 1.创建socket套接字
    tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 2.获取服务器ip/port
    dest_ip = input("请输入下载服务器ip:")
    dest_port = int(input("请输入下载服务器port:"))
    server_addr = (dest_ip,dest_port)
    # 3.连接服务器
    tcp_client_socket.connect(server_addr)
    # 4.获取下载文件名
    downfile_name = input("请输入要下载的文件名:")
    # 5.将文件名字发送到服务器
    tcp_client_socket.send(downfile_name.encode("utf-8"))
    # 6.接受文件的数据
    recv_data = tcp_client_socket.recv(1024*10)
    # 7.保存接受的数据到一个文件中
    if recv_data:
        with open("[附件]"+downfile_name,"wb") as f:
            f.write(recv_data)
    # 8.关闭套接字
    tcp_client_socket.close()
if __name__ == "__main__":
    main()

服务端代码

import socket 


def send_file_2_client(new_client_socket,client_addr):
    # 1.接受客户端发送过来的要下载的文件名
    file_name = new_client_socket.recv(1024).decode("utf-8")
    print("客户端%s需要下载的文件是:%s" % (str(client_addr),file_name))
    
    # 2.打开客户端需要下载的文件,读取数据
    file_content = None  #先定义文件为空
    try:
        f = open(file_name,"rb")
        file_content = f.read() # 如果有这个文件,file_content将被覆盖
        f.close()
    except Exception as ret:
        print("没有要下载的文件%s" % file_name)
    # 3.发送文件的数据给客户端
    if file_content:
        new_client_socket.send(file_content)
 

def main():
    # 1.创建套件字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 2.绑定本地信息ip、port
    tcp_server_socket.bind(("",9999))

    # 3.将套接字设置为Listen
    tcp_server_socket.listen(128)
    while True:  # 维多用户提供服务    
        # 4.等待客户端连接
        print("等客户端接入...")
        new_client_socket,client_addr = tcp_server_socket.accept()
        # 5.发数据 调用函数
        send_file_2_client(new_client_socket,client_addr)
       
        # 5.关闭套接字
        new_client_socket.close()
    tcp_server_socket.close()
if __name__ == "__main__":
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值