设为首页 收藏本站
查看: 737|回复: 0

[经验分享] python socket学习

[复制链接]

尚未签到

发表于 2018-8-5 09:53:43 | 显示全部楼层 |阅读模式
  一、简单实例:
  实现客户端向服务端发送的信息,服务器收到信息后加上当前时间再返回给客户端
  服务端实现:
#!/usr/bin/python  
import socket, traceback, time
  
host = ''
  
port = 8000
  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  
s.bind((host, port))
  
s.listen(1)
  
while 1:
  try:
  clientsock, clientaddr = s.accept()
  except KeyboardInterrupt:
  raise
  except:
  traceback.print_exc()
  continue
  try:
  print "Got connection from", clientsock.getpeername()
  while 1:
  data = clientsock.recv(4096)
  if not len(data):
  break
  clientsock.sendall("[%s] %s" % (time.ctime(),data))
  except (KeyboardInterrupt, SystemExit):
  raise
  except:
  traceback.print_exc()
  
try:
  clientsock.close()
  
except KeyboardInterrupt:
  raise
  
except:
  traceback.print_exc()
  客户端实现:
#!/usr/bin/pythonh  
import socket, ssl
  
host = '192.168.209.128'
  
port = 8000
  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  
s.connect((host, port))
  
while True:
  data = raw_input('please input data:')
  if not data:
  break
  s.sendall(data)
  data = s.recv(4096)
  print data
  
ssl_sock.close()
  运行测试:
  [root@localhost example]# python echoclient1.py
  please input data:test python
  [Sun Sep 15 14:38:47 2013] test python
  please input data:test 1111111111111111111111
  [Sun Sep 15 14:38:52 2013] test 1111111111111111111111
  please input data:
  二、socket 多任务处理
  以上代码要实现的功能是实现了,但是当你用多个客户端同时执行向服务器端发送信息的时候,就发现同一时间服务端只能处理一个连接,其他的无法正常返回。这是因为服务端的单线程实现的,当收到一个客户端请求处理的时候,就会进入阻塞状态,无法同时处理多个任务。
  为了能够同时为多个客户端服务,需要能够同时处理多个网络连接的方法。可通过三种方法来实现:
  forking、threading和异步I/O。
  通过threading实现服务端:
#!/usr/bin/python  
import socket, traceback, os, sys, time
  
from threading import *
  
host = ''
  
port = 8000
  
def handlechild(clientsock):
  print "New child", currentThread().getName()
  print "Got connection from", clientsock.getpeername()
  while 1:
  data = clientsock.recv(4096)
  if not len(data):
  break
  clientsock.sendall("[%s] %s" % (time.ctime(),data))
  clientsock.close()
  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
  
s.bind((host, port))
  
s.listen(1)
  
while 1:
  try:
  clientsock, clientaddr = s.accept()
  except KeyboardInterrupt:
  raise
  except:
  traceback.print_exc()
  continue
  t = Thread(target = handlechild, args = [clientsock])
  t.setDaemon(1)
  t.start()
  这样就可以让服务器同时处理多个任务了。
  三、在服务端和客户端使用ssl
  首先创建一个自签名证书:
  openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.key
  服务端:
#!/usr/bin/python  
import socket, ssl, traceback, threading, sys, time
  
host = ''
  
port = 443
  
def Myhandlechild(clientsock):
  print "New child", threading.currentThread().getName()
  print "Got connection from", clientsock.getpeername()
  while 1:
  data = clientsock.recv(4096)
  if not len(data):
  break
  clientsock.sendall("[%s] %s" % (time.ctime(),data))
  clientsock.close()
  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  
s.bind((host, port))
  
s.listen(5)
  
while 1:
  try:
  clientsock, clientaddr = s.accept()
  connsock = ssl.wrap_socket(clientsock, server_side=True,
  certfile="cert.pem", keyfile="cert.key")
  except KeyboardInterrupt:
  raise
  except:
  traceback.print_exc()
  continue
  t = threading.Thread(target = Myhandlechild, args = [connsock])
  t.setDaemon(1)
  t.start()
  客户端:
#!/usr/bin/pythonh  
import socket, ssl
  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  
ssl_sock = ssl.wrap_socket(s,ca_certs="cert.pem", cert_reqs = ssl.CERT_REQUIRED)
  
ssl_sock.connect(('127.0.0.1', 443))
  
while 1:
  data = raw_input('input data:')
  if not data:
  break
  ssl_sock.sendall(data)
  data = ssl_sock.recv(4096)
  print data
  
ssl_sock.close()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-546845-1-1.html 上篇帖子: python MySQLdb 常用操作 下篇帖子: python, my first code
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表