python socket学习
一、简单实例:
实现客户端向服务端发送的信息,服务器收到信息后加上当前时间再返回给客户端
服务端实现:
#!/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()
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341