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的套接字 ...
随机推荐
- Windows下查看游戏服务器的IP地址
在任务管理器中查看进程的PID 在cmd中使用netstat -aon,找到PID对应的IP地址
- Histogram of Oriented Gridients(HOG) 方向梯度直方图
Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉.模式识别领域很常用的一种描述图像局部纹理的特征.这个特征名字起的也很直白,就是说先计算图片某一区域中不同 ...
- (二维数组 亿进制 或 滚动数组) Hat's Fibonacci hdu1250
Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 五个免费UML建模工具
UML工具很多是商用的,价格不菲:而免费的UML建模工具,功能完善的很少.以下推荐的是五个免费的UML建模工具,相对而言还算功能比较不错. 免费UML建模工具推荐:JUDE – community 如 ...
- python高级数据可视化Dash2
k 线国内版 python dash 的应用首页,是用一个 k 线图来做 damo 的,奈何数据源用的 Google,上不去.当然,可以换 yahoo,但是毕竟国内的还是更亲切些. 官方的 demo ...
- Omnibus test
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...
- Python 爬虫的工具列表 附Github代码下载链接
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- PLSQL Developer 连接Linux 下Oracle的安装与配置
一.下载 下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 这是Ora ...
- 转--python 基础
核心库 1.NumPy 当我们用python来处理科学计算任务时,不可避免的要用到来自SciPy Stack的帮助.SciPy Stack是一个专为python中科学计算而设计的软件包,注意不要将它 ...
- 解决IntelliJ IDEA无法读取配置*.properties文件的问题
idea对这些配置的文件方式很明显和eclipse是不同的.在idea中有一个 Content Roots的概念.需要为每一个folder配置相应的Content Roots.Content Root ...