python下的socket





1、简单的server和client端的socket代码

server.py:





#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import socket

ip_port = ('127.0.0.1',9999)





sk = socket.socket()

sk.bind(ip_port)

sk.listen(1)





while 1:

    print 'waiting'

    conn,addr = sk.accept()

    conn.sendall('welcome to 10086')

    conn.close()





client.py:





#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import socket





ip_port = ('127.0.0.1',9999)





sk = socket.socket()

sk.connect(ip_port)





data = sk.recv(1024)

sk.close()





print data





分别在两个窗口运行:

# python server.py

# python client.py





2、多线程,阻塞模式

server.py:





#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import socket

# 阻塞式

sk = socket.socket()

ip_port = ('192.168.8.51',50001)





sk.bind(ip_port)

sk.listen(2)





while True:

    conn,addr = sk.accept()

    print 'get a data from ',addr

    while True:

        

        data = conn.recv(1024)

        if not data : break

        conn.send(data.upper())

        print 'recevie:',data

sk.close()





client.py:





#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import socket





ip_port = ('192.168.8.51',50001)

sk = socket.socket()

sk.connect(ip_port)





while True:

    input_data = raw_input('')

    sk.send(input_data)

    data = sk.recv(1024)

    print 'recevi:',data

    

sk.close()





3、模拟实现ssh





ssh_socket_server.py:





#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import SocketServer

import commands,time





class MySocksServer(SocketServer.BaseRequestHandler):

    

    def handle(self):

        print 'get a new conn from ',self.client_address

        

        while True:

            cmd = self.request.recv(1024)

            if not cmd:

                print 'lost connetion with',self.client_address

                break

            cmd_result = commands.getstatusoutput(cmd)

            # send result size

            self.request.send(str(len(cmd_result[1])))

            #self.sleep(0.2)

            

            # send result

            self.request.sendall(cmd_result[1])

            

if __name__ == '__main__':

    h = '0.0.0.0'

    p = 50003

    s = SocketServer.ThreadingTCPServer((h,p),MySocksServer)





    s.serve_forever()





socket_client:





#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import socket

from _mysql import result





ip_port = ('192.168.8.51',50003)





sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)





sk.connect(ip_port)





def recv_all(obj,msg_length):

    raw_result = ''

    while msg_length != 0:

        if msg_length <= 4096:

            data = obj.recv(msg_length)

            msg_length = 0

            

        else:

            data = obj.recv(4096)

            msg_length -= 4096

        raw_result += data

        

    return raw_result





while True:

    input_data = raw_input('')

    if len(input_data) == 0: break

    sk.sendall(input_data)

    

    # recv response size

    res_size = int(sk.recv(100))

    print 'data size from server',res_size

    

    result = recv_all(sk,res_size)

    print result





sk.close()





4、模拟实现ftp账号远程登录通过获取数据





ftp客户端

ftp_client.py:

#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import socket

import MySQLdb

import os

import hashlib

from _mysql import result





ip_port = ('192.168.50.18',50004)

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sk.connect(ip_port)





#连接数据库函数

def conn_db():

    try:

        return MySQLdb.connect(host='localhost',user='root',passwd='',port=3306)        

    except MySQLdb.Error,e:  

        print "Mysql Error %d: %s" % (e.args[0], e.args[1])

        

# md5加密的函数

def md5_create(name):

    code = hashlib.md5()

    code.update(name)

    return code.hexdigest()

     

#验证用户名密码是否正确

def login(username,password):

        #连接数据库

        conn = conn_db()

        

        cur = conn.cursor()

        conn.select_db('python')

        

        cur.execute('select password from user where username = "%s"' % username)

        result = cur.fetchone()

        md5code = md5_create(password)

        

        #验证密码是否正确

        if result[0] == md5code:

            return True

        else:

            return False





def recv_all(obj,msg_length):

    raw_result = ''

    while msg_length != 0:

        if msg_length <= 4096:

            data = obj.recv(msg_length)

            msg_length = 0

            

        else:

            data = obj.recv(4096)

            msg_length -= 4096

        raw_result += data

        

    return raw_result





#获取数据函数

def get_all(self,obj,msg_length,dst_file):

       

        while msg_length != 0:

            if msg_length <= 4096:

                data = obj.recv(msg_length)

                msg_length = 0

                print 'to less ',msg_length

            else:

                data = obj.recv(4096)

                msg_length -= 4096

                print 'else ',msg_length

            dst_file.write(data)

        

        return 'done'





while True:

    user_input = raw_input('please input your username and password eg: user pwd ')

    if len(user_input) == 0:

        print 'your username or password is error'

        break

    

    username,password = user_input.split()

    #验证用户密码是否正确

    login_rs = login(username,password)

    

    if login_rs:

        while True:

            user_input = raw_input('msg to send::')

            if len(user_input) == 0: continue

            

            user_cmd = user_input.split()

            

            #如果命令为put则进行传输数据

            if user_cmd[0] == 'put':

                if len(user_cmd) == 2:

                    f = file(user_cmd[1] , 'rb')

                    f_size = os.stat(user_cmd[1]).st_size

                    sk.send("%s %s %s" %(user_cmd[0],user_cmd[1],f_size))

                    

                    print 'going to send...'

                    sk.sendall(f.read())

                    print sk.recv(1024)

                    

            else:

                sk.sendall(user_cmd[0])

                print 'else',user_cmd[0]

                res_size = int(sk.recv(100))

                print 'data size from server',res_size

                

                result = recv_all(sk,res_size)

                print result

                





sk.close()





服务器端:

ftp_server.py





#!/usr/bin/env python

#_*_ coding:utf-8 _*_





import SocketServer

import commands

import socket





class MySocksServer(SocketServer.BaseRequestHandler):

    

    def recv_all(self,obj,msg_length,dst_file):

       

        while msg_length != 0:

            if msg_length <= 4096:

                data = obj.recv(msg_length)

                msg_length = 0

                print 'to less ',msg_length

            else:

                data = obj.recv(4096)

                msg_length -= 4096

                print 'else ',msg_length

            dst_file.write(data)

        

        return 'done'





    def handle(self):

        print 'get a new conn from ',self.client_address

        

        while True:

            cmd = self.request.recv(1024)

            if not cmd:

                print 'lost connetion with',self.client_address

                break

            #option,filename,file_size = cmd.split()

            cmd_c = cmd.split()

            

            if cmd_c[0] == 'put':

                # client want to upload file

                f = file('recv/%s' % cmd_c[1],'wb')

                write_to_file = self.recv_all(self.request, int(cmd_c[2]), f)

                if write_to_file == 'done':

                    self.request.send('file upload success')

                    f.close()

                    

            else:

                print 'start send cmd back info'

                cmd_result = commands.getstatusoutput(cmd_c[0])

                self.request.send(str(len(cmd_result[1])))

                self.request.sendall(cmd_result[1])

            

if __name__ == '__main__':

    h = '0.0.0.0'

    p = 50004

    s = SocketServer.ThreadingTCPServer((h,p),MySocksServer)

    sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    s.serve_forever()

python下的socket常用方法举例的更多相关文章

  1. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  2. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  3. python下的web服务器模块

    python下的web服务模块有三种: BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler SimpleHTTPS ...

  4. python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题

    今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...

  5. Day28--Python--网络通信协议 tcp与udp下的socket

    昨日内容回顾: 1. CS架构 服务端客户端架构 软件CS架构: 京东,淘宝,QQ,微信,暴风影音,快播 硬件CS架构: 打印机 服务端: 提供服务的 客户端: 享受服务的 BS架构: 浏览器和服务端 ...

  6. python网络编程:socket、服务端、客户端

    本文内容: socket介绍 TCP: 服务端 客户端 UDP: 服务端 客户端 首发时间:2018-02-08 01:14 修改: 2018-03-20 :重置了布局,增加了UDP 什么是socke ...

  7. Day10 Python网络编程 Socket编程

    一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...

  8. python基础之socket与socketserver

    ---引入 Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’.套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成.Socket正如其英文原意那样,像一个多孔 ...

  9. python基础之socket编程 (转自林海峰老师)

    python基础之socket编程   阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...

随机推荐

  1. intent 几种用法

    Intent 应该算是Android中特有的东西.你可以在Intent中指定程序 要执行的动作(比如:view,edit,dial),以及程序执行到该动作时所需要的资料.都指定好后,只要调用start ...

  2. 做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk

    前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! ...

  3. 【LOJ#6278】数列分块2

    题目大意:分块维护一个有 n 个数字的序列,有两种操作:区间加,区间查询小于某个数的元素个数.n <= 50000 预处理阶段:处理出块内元素的相对大小顺序(排序),时间复杂度为 \(O(nlo ...

  4. Linux:打印(输出)所有的列(awk, $0)

    如果想输出所有的列的话,只需要$0这个函数,例如以下命令: awk '/rs16945916/ {print $0}' test.txt > allcol.txt rs16945916指的是打印 ...

  5. idea 普通 web项目配置启动【我】

    首先说这是一个普通的java web项目,没有用到maven.  检出项目: 项目是先用 乌龟svn 在 编辑器外部检出到一个目录下,然后再用 idea的 open 打开这个目录生成的.[因为直接用i ...

  6. Arraylist集合遍历输出

    题目:创建一个只能容纳String对象名为names的Arraylist集合,按顺序向集合中添加5个字符串对象.对集合进行遍历,打印出集合中每个元素的位置与内容.首先打印出集合的大小,然后删除集合中的 ...

  7. Java ExecutorService四种线程池的例子与说明

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  8. MySQL中的时态(日期/时间)数据类型

    时态类型的取值范围 mysql> create table t (dt datetime,d date,t time); Query OK, 0 rows affected (0.30 sec) ...

  9. 【JUC】CountDownLatch

    因为在调用端的异步中,需要调用其他多个服务获取数据再汇总结果返回,所以用到了CountDownLatch CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个 ...

  10. bzoj4802 欧拉函数(附Millar-Rabin和Pollard-Rho讲解)

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4802 [题解] 参考:http://www.matrix67.com/blog/archiv ...