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的套接字 ...
随机推荐
- Java NIO -- DatagramChannel
Java NIO中的DatagramChannel是一个能收发UDP包的通道.操作步骤:打开 DatagramChannel接收/发送数据 代码举例: package com.soyoungboy.n ...
- Windows 10更新时出现0x80070422错误
Windows更新 更新状态 安装更新时出现一些问题,但我们稍后会重试.如果你继续看到此错误,并想要搜索Web或联系支持人员以获取相关信息,一下信息可能会对你有帮助:(0x80070422) 分析原因 ...
- 【洛谷P2746】Network of Schools
题目大意:给定一个 N 个点,M 条边的有向图,第一问求至少从多少个点出发才能遍历整个有向图,第二问求至少在这个有向图的基础上加多少条边才能使得该无向图强连通. 题解:先进行 Tarjan 缩点,得到 ...
- 百度地图API 循环向 marker 添加 click事件
使用百度地图API,循环向marker添加InfoWindow时,所有的marker点击弹出的inforwindow为最后一个添加的infowindow,百度后,使用js闭包解决此问题,直接贴代码: ...
- org.apache.catalina.LifecycleException: Failed to stop component(生命周期异常)
真是郁闷透顶,以前昨天还可以用,换了myeclipse自带的tomcat就可以用: 异常: org.apache.catalina.LifecycleException: Failed to stop ...
- 关于bottle WEB框架中签名cookie的一点理解
首先要理解一个概念 MAC (message authenticate code) 消息认证码(带密钥的Hash函数):密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具. 构造方 ...
- ubuntu14.04 桌面版/服务器版安装DevStack教程
官网安装教程链接:https://docs.openstack.org/developer/devstack/ 我在ubuntu14.04 LTS 桌面版/服务器版都安装DevStack成功后,在这里 ...
- 盖得化工----requests/bs4---采集二级网址
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- 设计模式---对象创建模式之工厂方法模式(Factory Method)
前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...
- 9 Web开发——springmvc自动配置原理
官方文档目录: https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-sp ...