socket&socket实现ftp的get方法、socketserver

首先了解socket工作原理,client-server模式

1、socket客户端:

2、socket类型

3、socket数据流

4、实验

(1)写一个client

服务端启动监听ip和端口

admindeMacBook-Air-62:~ admin$ nc -l 1234

客户端连接服务端,发数据,关闭socket

pycharm中添加一个socket_client.py并之行:

import socket
HOST = ‘127.0.0.1‘
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST,PORT))
s.sendall(‘hello world‘)
s.close()

服务端退出socket

admindeMacBook-Air-62:~ admin$ nc -l 1234
hello world
admindeMacBook-Air-62:~ admin$

客户端发送10次

socket_client10.py

#-*-coding: UTF-8 -*-
#coding=utf-8
import socket
import time
HOST = ‘127.0.0.1‘
PORT = 1234
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #元祖(网络socket,tcp) 
s.connect((HOST,PORT))
for i in range(10):
    s.sendall(‘%s  hello, world\n‘ %i)
    time.sleep(1)
s.close()

服务端打印10次退出

admindeMacBook-Air-62:~ admin$ nc -l 1234
0  hello, world
1  hello, world
2  hello, world
3  hello, world
4  hello, world
5  hello, world
6  hello, world
7  hello, world
8  hello, world
9  hello, world
admindeMacBook-Air-62:~ admin$

(2)写一个server

socket_server01.py

#coding=UTF-8
import socket
import time
HOST = ‘‘ #表示监听0.0.0.0
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #网络,tcp
s.bind((HOST,PORT))
s.listen(1)    #一次接受一个,写2也是一次接受一个
connect, address = s.accept()  #接受客户端的请求,返回的是一个连结句柄connect+地址
print ‘connent‘,connect
print ‘Connected by‘, address
while 1:
    data = connect.recv(1024)
    if not data: break
    connect.sendall(data.upper())
connect.close()
admindeMacBook-Air-62:host_performance-monitor admin$ python socket_server01.py

启动程序并查看端口

admindeMacBook-Air-62:~ admin$ netstat -an | grep 1234
tcp4       0      0  *.1234                 *.*                    LISTEN

客户端:

socket-client for server.py

#-*-coding: UTF-8 -*-
#coding=utf-8
import socket
import time
HOST = ‘127.0.0.1‘
PORT = 1234
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #网络socket,tcp
s.connect((HOST,PORT))
s.sendall(‘hello, world‘) #客户端发送1024字节
data = s.recv(1024) #接受服务器发送过来的数据
s.close()
print  ‘Received‘, repr(data) #打印服务端发送过来的数据
print data

客户端之行发送hello world,接受HELLO WORLD

python socket-client for server.py
Received ‘HELLO, WORLD‘
HELLO, WORLD
admindeMacBook-Air-62:host_performance-monitor admin$ python socket_server01.py
connent <socket._socketobject object at 0x10427ec20>
Connected by (‘127.0.0.1‘, 63878)

现在让客户端一直发,服务端一直接受数据,一端关闭socket连接,另一端也自动关闭连接

server端代码基本上不变

socket_server01.py

#coding=UTF-8
import socket
import time
HOST = ‘‘ #表示监听0.0.0.0
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #网络,tcp
s.bind((HOST,PORT))
s.listen(1)    #一次接受一个,写2也是一次接受一个
connect, address = s.accept()  #接受客户端的请求,返回的是一个连结句柄connect+地址
print ‘connent‘,connect
print ‘Connected by‘, address
while 1:
    data = connect.recv(1024)
    print data
    if not data: break
    connect.sendall(data.upper())
connect.close()

启动server,并查看端口:

admindeMacBook-Air-62:host_performance-monitor admin$ python socket_server01.py
admindeMacBook-Air-62:~ admin$ netstat -an | grep 1234
tcp4       0      0  *.1234                 *.*                    LISTEN

client端代码:

vim clinet_not_stop.py
#-*-coding: UTF-8 -*-
#coding=utf-8
import socket
import time
HOST = ‘127.0.0.1‘
PORT = 1234
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #网络socket,tcp
s.connect((HOST,PORT))
while True:
s.sendall(‘hello, world‘) #客户端发送1024字节
data = s.recv(1024) #接受服务器发送过来的数据
print data
time.sleep(1)
s.close()
admindeMacBook-Air-62:host_performance-monitor admin$ python  python clinet_not_stop.py  client接受到server大写返回
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD

同时可以看到server端的来自client的发送数据,全部小写的hello world

admindeMacBook-Air-62:host_performance-monitor admin$ python socket_server01.py
connent <socket._socketobject object at 0x10baedc20>
Connected by (‘127.0.0.1‘, 64589)
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world
hello, world

按ctrl+c终止传输

新的需求,客户端发送命令,服务端接收命令并之行,并返回结果,客户端使用exit或者quit,退出。

server:socket_server_command.py

#-*-coding: UTF-8 -*-
#coding=UTF-8
import socket
from subprocess import Popen,PIPE
HOST = ‘‘ #表示监听0.0.0.0
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #网络,tcp
s.bind((HOST,PORT))
s.listen(1)    #一次接受一个,写2也是一次接受一个
connect, address = s.accept()  #接受客户端的请求,返回的是一个连结句柄connect+地址
print ‘connent‘,connect
print ‘Connected by‘, address
while 1:
    cmd = connect.recv(1024)
    p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True)
    stdout = p.stdout.read()
    stderr = p.stderr.read()
    if stdout:
        connect.sendall(stdout)
    if stderr:
        connect.sendall(stderr)
    if not cmd: break
connect.close()

client:socket_clinet_command.py

#-*-coding: UTF-8 -*-
#coding=utf-8
import socket
import time
import tab #参考:http://daixuan.blog.51cto.com/5426657/1934112
HOST = ‘127.0.0.1‘
PORT = 1234
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #网络socket,tcp
s.connect((HOST,PORT))
while True:
    cmd = raw_input("Please input cmd:").strip() #把空字符串命令去掉,做一个判断,非空再发送
    if cmd.lower() == ‘exit‘ or cmd.lower() == ‘quit‘:
        break
    if cmd:
        s.sendall(cmd) #客户端发送命令
        data = s.recv(1024) #接受服务器发送过来的数据
        print data
s.close()

server启动服务:(有客户端连接会显示连接句柄)

admindeMacBook-Air-62:host_performance-monitor admin$ python socket_server_command.py
connent <socket._socketobject object at 0x109192de0>
Connected by (‘127.0.0.1‘, 65512)

客户端启动并之行命令:

admindeMacBook-Air-62:host_performance-monitor admin$ python socket_clinet_command.py
Please input cmd:date
2017年 6月10日 星期六 18时34分21秒 CST
Please input cmd:pwd
/Users/admin/Desktop/project/host_performance-monitor
Please input cmd:exit

5、实现FTP下载功能:

1、get source dest

2、重复文件,加.new

3、打印出来get下来的文件名是/tmp/hosts 还是/tmp/hosts.new

服务端:socket_server_ftp.py

#-*-coding: UTF-8 -*-
#coding=UTF-8
import socket
from subprocess import Popen,PIPE
HOST = ‘‘ #表示监听0.0.0.0
PORT = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #网络,tcp
s.bind((HOST,PORT))
s.listen(1)    #一次接受一个,写2也是一次接受一个
connect, address = s.accept()  #接受客户端的请求,返回的是一个连结句柄connect+地址
print ‘connent‘,connect
print ‘Connected by‘, address
while 1:
    cmd = connect.recv(1024)
    cmd_list = cmd.split()
    if cmd_list[0] == ‘get‘:   #如果是get方法,读数据
        with open(cmd_list[1]) as fd:
            while True:   #循环读取1024字节,然后返回一个数
                data = fd.read(1024)
                connect.sendall(data)
                if not data:   #数据读完了,跳出while循环
                    connect.sendall(‘EOF‘)
                    break
    if not cmd: break
connect.close()

客户端:socket_clinet_ftp.py

#-*-coding: UTF-8 -*-
#coding=utf-8
import socket
import time
import tab  #参考:http://daixuan.blog.51cto.com/5426657/1934112
import os
HOST = ‘127.0.0.1‘
PORT = 1234
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #网络socket,tcp
s.connect((HOST,PORT))
while True:
   cmd = raw_input("Please input cmd:").strip() #把空字符串命令去掉,做一个判断,非空再发送
   if cmd.lower() == ‘exit‘ or cmd.lower() == ‘quit‘:
       break
   cmd_list = cmd.split()
   if len(cmd_list) != 3:
       print "Ex: get file1 file2"
       continue
   else:
       s.sendall(cmd) #客户端发送命令
       if not os.path.exists(cmd_list[2]):
           dst_file = cmd_list[2]
       else:
           dst_file = cmd_list[2]+‘.new‘
       n = 1   #定义一个变量,第一次打开文件是wb方式,第二次打开文件是a(追加)的方式打开。
       while True:
           data_rev = s.recv(1024)  # 接受服务器发送过来的数据,但是服务器发送完数据,客户端仍在等待,就会卡住。用EOF,就break
           if data_rev.endswith(‘EOF‘):
               data = data_rev[:-3]
           else:
               data = data_rev
           if n == 1:
               with open(dst_file, ‘wb‘)  as fd:
                   fd.write(data)
           else:
               with open(dst_file, ‘a‘) as fd:
                   fd.write(data)
                   print data
           n +=1
           print "destination file is %s" %dst_file
           if data_rev[-3:] == ‘EOF‘:  #如果最后三个字符是EOF,退出ftp
               break
s.close()

启动服务端:

admindeMacBook-Air-62:host_performance-monitor admin$ python socket_server_ftp.py
connent <socket._socketobject object at 0x104ecbde0>
Connected by (‘127.0.0.1‘, 53858)

启动客户端:

admindeMacBook-Air-62:host_performance-monitor admin$ python socket_clinet_ftp.py
Please input cmd:get /etc/hosts /tmp/hosts
destination file is /tmp/hosts
Please input cmd:get /etc/hosts /tmp/hosts
destination file is /tmp/hosts.new

6、SocketServer

socketserver是一个类,自带多线程

编写一个hander类,继承BaseRequestHander,重写handle()方法

针对tcp还是udp生成一个server对象

调用server对象的handle_request或者sever_forver方法

socket&socket实现ftp的get方法、socketserver

时间: 2024-10-21 15:26:08

socket&socket实现ftp的get方法、socketserver的相关文章

python网络编程socket模块实现ftp上传下载

本实验实现ftp上传文件下载文件功能,并具有校验文件完整性,打印进度条功能, 主要练习socket,struct模块. ftp用户文件存放在user.json文件中 user.json文件内容 {"lisi": "abcdef", "hyh": "123456"} ftp客户端脚本ftpclient.py #!/usr/bin/python # --*-- coding: utf-8 --*-- import socket i

java网络编程ServerSocket类 和Socket类的常用构造方法及其方法

Socket类Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号.Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号.Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口.Socket(String ho

node.js的net模块的socket.setTimeout(time,[fun(){}])的使用方法及测试

2015-12-9 10:49:09 之前的socket服务器未对超时的socket做处理,客户端通信不通自动断开之后,服务器因不知情而一直维护着socket链接,而断开的客户端会重新申请一个新的连接占用新的端口,时间长了之后就会有大量的假连接占用了大量的端口.可以使用socket.setTimeout(time,[fun(){}])方法断开空闲的链接. server.js var net = require('net'); var server = net.createServer(funct

Java网络编程从入门到精通(18):Socket类的getter和setter方法(2)

二.用于获得和设置Socket选项的getter和setter方法 Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: public final static int TCP_NODELAY = 0x0001;    public final static int SO_REUSEADDR = 0x04;    public final static int

Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)

在Java类中,getter和setter方法占了很大的比重.由于Java中没有定义属性的关键字:因此,getter和setter方法用于获得和设置Java类的属性值:如getName和setName方法用于设置name属性的值.如果某个属性只有getter方法,那这个属性是只读的:如果只有setter方法,那么这个属性是只写的.在Socket类中也有很多这样的属性来获得和Socket相关的信息,以及对Socket对象的状态进行设置. 一.用于获得信息的getter方法 我们可以从Socket对

测试Socket中的一个中断的方法

/* * 本程序用于测试Socket中的一个中断的方法 * 对于进行的线程可以对其进行停止的中断 * 是通过SocketChannel channel = SocketChannel.open(new InetSocketAddress(host, port)); * */ package interruptible; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEve

Socket网络编程--FTP客户端(2)(Windows)

上一篇FTP客户端讲到如果制作一个简单的FTP客户端,功能实现了,但是后面我们发现了问题,就是FTP是使用明文进行操作的.对于普通情况来说就无所谓了.但有时候要安全的一点的话,就应该使用FTP的安全版本.有SFTP和FTPs,两者都是FTP的安全版本,但是两者的实现原理差别还是很大的,具体自己搜索了解. 0.环境安装 环境使用我的这一篇文章安装好libssh2库. http://www.cnblogs.com/wunaozai/p/4528394.html 使用一个带有SFTP功能的FTP服务器

关一Socket得到的InputStream,read方法最后一直阻塞的问题

今天在尝试使用protobuf在服务端和android进行数据转递和解析时遇到一个小问题,这里记录一下.大概的场景是pc与android使用socket通信,pc为服务端,android向服务端发送请求后,服务端将protobuf对象返回给android端.android端得到InputStream后转换为byte[]再转换为protobuf对象.出现的问题就是InputStream在转换为byte[]部是发生阻塞,不能成功. socket client端在接收到服务端的InputStream后

node的socket.io的之基本使用方法.

使用socket.io的使用创建一个socket.io服务器即可.但是该服务器依赖于一个已经创建的http服务器. 在http服务器运行之后,使用listen方法为该http服务器附加一个socket.io服务器. var sio=require("scoket.io"); var socket=sio.listen(server); socket就是在server基础上创建的一个socket.io服务器. 当客户端与服务器端建立连接时,触发socket.io服务的connection