首先我们可以看下可以最简单的交互性的服务端和客户端程序

server

import socket

def main():
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('localhost',8000))
sock.listen(5)
while True:
print '1'
connection ,clent_addr = sock.accept()
while 1:
buf = connection.recv(1024)
connection.sendall('hi')
print buf
connection.close()
if __name__ == '__main__':
main()

[server]:在创建socket之后,服务端会一直保持阻塞状态,然后一旦有用户连接,就立即等待用户发送数据,然后接收到用户发的数据之后 理解返回一个字符后,然后状态变成等待下次连接

client

import socket
sock = socket.socket()
sock.connect(('localhost', 8000))
sock.settimeout(5)
while 1:
res = sock.recv(1024)
print res
data = raw_input('input:')
sock.sendall(data)
sock.close()

[client]:去连接server端然后不断发送数据,然后接受返回。

-------------------------------------------------------------------------------

那么你可以发现上面的server端的代码 其实只能同时接受一个请求,因为只有一个线程去处理这个段代码

那么我可以吧server端的代码换成

import SocketServer

class MyServer(SocketServer.BaseRequestHandler,object):
def handle(self):
conn = self.request
conn.sendall('this is a tast')
Flag = True
while Flag:
data = conn.recv(1024)
print "data:",data
if data == "exit":
Flag = True
elif data == '0':
conn.sendall("The winter in comming")
else:
conn.sendall("please input again") if __name__ == "__main__":
server01 = SocketServer.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
print "server is running.."
server01.serve_forever()

我们通过借助socket自带的类写出来了 多线程的服务器端,能够收发消息

那么我们可以在这个代码的基础上修改,能够发送命令,返回命令

[server]

import SocketServer,os

class MyServer(SocketServer.BaseRequestHandler,object):
def handle(self):
conn = self.request
Flag = True
while Flag:
data = conn.recv(1024)
res = os.popen(data).read()
res_length=len(res)
conn.send(str(res_length))
msg_num = conn.recv(1024)
if msg_num == "":
print len(res),"-->len"
print "data:",data
conn.sendall(res) if __name__ == "__main__":
server01 = SocketServer.ThreadingTCPServer(('127.0.0.1',8040),MyServer)
print "server is running.."
server01.serve_forever()

[client]

import socket
sock = socket.socket()
sock.connect(('localhost', 8040))
sock.settimeout(5)
while 1:
data = raw_input('input:')
sock.sendall(data)
res_length = int(sock.recv(1024))
sock.send("")
print 'length:',res_length
while True:
if res_length <= 0:
break
res = sock.recv(1024)
print res
res_length -= 1024
sock.close()

这里需要注意的是

1:因为服务端 不知道能发送多大的数据,那么在接收数据之前我们需要,先验证一下数据长度,然后根据长度,来决定如何收取

python-网络编程-03的更多相关文章

  1. Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信

    Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命令.socketserver通信 目录 Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命 ...

  2. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  3. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  4. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  5. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  6. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  7. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  8. Python网络编程基础pdf

    Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...

  9. python 网络编程(Socket)

    # from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...

  10. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

随机推荐

  1. ECShop怎么首页调用文章列表

    举例如首页调用方法:1.先打开index.php文件找到以下代码:$smarty->assign('new_articles', index_get_new_articles()); // 最新 ...

  2. 前端HTML以及HTML5(基本标签)

    前面一章介绍了一下前端的发展,这章简单介绍一下html的发展以及基本的标签. 一.HTML的发展史 1.概念 超文本标记语言(HyperText Markup Language,简称HTML)是为 [ ...

  3. Jmeter监控内存及CPU等

    在进行性能测试时需要查看内存和CPU等信息来判断系统瓶颈,关于CPU和内存的监控,goole开发了一款专门的jmeter插件,弥补了Jmeter这方面的不足,下面来介绍这款插件-JmeterPlugi ...

  4. Git随笔:尝试将本地工程上传至Github上的repository仓库,构建远端与本地协同的Git环境

    上传工程至自己的Github公开库,步骤如下: 第1步:建立本地 git 仓库,cd 到你的本地项目根目录下,执行 git init 命令: 第2步:将本地项目工作区的所有文件添加到暂存区.小数点 & ...

  5. Win10微软帐户切换不回Administrator本地帐户的解决方法【亲测】

    在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...

  6. HDU 5500 Reorder the Books (水题)

    题意: 有n本书,编号为1~n,现在书的顺序乱了,要求恢复成有序的样子,每次只能抽出其中一本并插到最前面,问最少需要多少抽几次? 思路: 如果pos[i]放的不是书i的话,则书i的右边所有的书都必须抽 ...

  7. 2017.10.6 QBXT 模拟赛

    题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...

  8. Memcached笔记之分布式算法

    1.根据余数进行分散:离散度高,但是增加或者移除服务器的时候,缓存充足的代价非常大.添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器,从而音像缓存的命中率. 2.Consistent ...

  9. python_83_random_应用验证码

    import random checkcode='' for i in range(0,5):#5位验证码 current=random.randrange(0,5) #字母 if current== ...

  10. MFC:DISP_FUNCTION 参数

    /*#include <afxdisp.h>DISP_FUNCTION( theClass, pszName, pfnMember, vtRetVal, vtsParams )参数:the ...