python下的socket常用方法举例
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常用方法举例的更多相关文章
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例
SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html 分享到:8 发布时 ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
- python下的web服务器模块
python下的web服务模块有三种: BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler SimpleHTTPS ...
- python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题
今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...
- Day28--Python--网络通信协议 tcp与udp下的socket
昨日内容回顾: 1. CS架构 服务端客户端架构 软件CS架构: 京东,淘宝,QQ,微信,暴风影音,快播 硬件CS架构: 打印机 服务端: 提供服务的 客户端: 享受服务的 BS架构: 浏览器和服务端 ...
- python网络编程:socket、服务端、客户端
本文内容: socket介绍 TCP: 服务端 客户端 UDP: 服务端 客户端 首发时间:2018-02-08 01:14 修改: 2018-03-20 :重置了布局,增加了UDP 什么是socke ...
- Day10 Python网络编程 Socket编程
一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...
- python基础之socket与socketserver
---引入 Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’.套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成.Socket正如其英文原意那样,像一个多孔 ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
随机推荐
- 【POJ1015】Jury compromise 多个费用的背包
这是一道比较综合的动态规划问题. 首先,根据题目中的从N个人中选出M个人,并且要使得某个目标函数最优,可以想到是背包问题,且因为要取出M个人,人数也应该作为背包体积的一个维度. 其次,要求输出路径,因 ...
- Sublime Text3—Project(项目管理)
摘要 Project 可以理解为项目.工程或者站点,以下称项目.使用项目管理的好处是:不用将所有文件都放到同一个根目录,可以将相关但不同路径的文件组成一个Project,每个项目都是独立的,文件的状态 ...
- CodeForces 纪念一下这个突破性的时刻
- 解决MATLAB出现"??? Undefined function or variable 'x'."的问题,一个等号引发的大战
最近写了一段代码,一直弹出“??? Undefined function or variable 'x'.”这个错误.仔细检查了一下,发现是赋值的问题.比如下面两段代码 h=1 h=x h=1表示的是 ...
- 【python】UnicodeEncodeError: 'ascii' codec can't encode/decode characters
解决方案在文件头插入 # encoding=utf8 import sys reload(sys) sys.setdefaultencoding('utf8')
- ELK 5.6.8 安装部署
操作系统版本: LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64: ...
- Hive记录-impala常用命令
1.impala是什么 Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据.已有的Hive系统虽然也提供了SQL ...
- Cannot send, channel has already failed: tcp://127.0.0.1:8161
解决方案一 我觉得你可能需要把服务完全停掉了 然后重启一下. http://localhost:8161(管理端口) tcp://127.0.0.1:61616(服务端口)
- windows Zookeeper本地服务化
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵 ...