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的套接字 ...
随机推荐
- (转)同一服务器部署多个tomcat时的端口号修改详情
背景:在同一个服务器上部署工程,总会遇到tomcat端口占用的情况,所有有必要分清楚各个端口的作用,和需要更改的端口. 同一服务器部署多个tomcat时,存在端口号冲突的问题,所以需要修改tomcat ...
- win32: 查询滚动条相关信息的注意事项
今天打算判断一个窗口是否出现垂直滚动条,我的代码: SCROLLINFO si; //滚动条信息结构体 si.cbSize = sizeof(SCROLLINFO ...
- 在Vue中如何使用axios跨域访问数据
最近在项目中需要用到axios,所以就恶补一下这个axios到底是什么东东.越来它是vue-resource的替代品,官网也说了,以后都用axios, vue-resource不在维护.那么这个axi ...
- “==”运算符与equals()
“==”运算符,比较内存地址 equals(),比较内容(值) public class Book { public static void main(String[] args) { String ...
- bootstrap3 input 验证样式【转】
feedback <form role="form"> <div class="form-group has-success has-feedback& ...
- 【JUC】JDK1.8源码分析之CyclicBarrier
一.前言 有了前面分析的基础,现在,接着分析CyclicBarrier源码,CyclicBarrier类在进行多线程编程时使用很多,比如,你希望创建一组任务,它们并行执行工作,然后在进行下一个步骤之前 ...
- mysql Mac终端操作
1.启动mysql :brew services start mysql 2.登陆mysql : mysql -u root -p mysql 命令. -u 后面接用户名 root超级管理 ...
- Java Web之路(五)JSP
一.jsp的3个指令 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: p ...
- VUE2.0 饿了吗视频学习笔记(三):VUE2.0取消了v-link
https://gitee.com/1981633/vue_study.git 源码下载地址,随笔记动态更新中 写法如下 <div class="tab-item"> ...
- k8s系列~mgr的应用
一 简介:今天咱们大体介绍下 这两者是如何联系的二 概念解析 pod:说下我的理解 1 pod通过yaml文件来封装docker本身+启动形式 2 pod可以运行多个docke ...