就像当初用C++写网络程序一样,Python的第一个网络程序肯定是最简单的阻塞的那种,即服务器绑定监听,等待客户端的连接,如果有客户端连接,则建立连接进行通信,服
务器是阻塞的没有多线程。
服务端:
-
-
-
- import socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.bind(("127.0.0.1", 8001))
- sock.listen(5)
-
- print 'wait for client connect...'
- cltSock, cltAddr = sock.accept()
-
- while True:
- print'got connection from ', cltSock.getpeername()
- data = cltSock.recv(1024)
- if None == data:
- break
- else:
- print 'recv from client:' , data
- cltSock.send(data[::-1])
-
客户端:
-
-
- import socket
- import time
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect(('127.0.0.1', 8001))
- time.sleep(1)
- print 'connect server success!'
-
- while True:
- data = raw_input("input data you want send to server : ")
- sock.send(data)
- data = sock.recv(1024)
- print "recv from server:", data
这个服务器的模型算是学前班级的,根本入不了门,下面就看看用多线程,客户端代码不变。
服务端:
-
-
-
- import socket
- import threading
- from time import sleep
-
- def offerServer(s):
- print'got connection from ', s.getpeername()
- while True:
- data = s.recv(1024)
- if None == data:
- break
- else:
- print 'recv from client:' , data
- s.send(data[::-1])
-
- if __name__ == '__main__':
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.bind(("127.0.0.1", 8001))
- sock.listen(5)
-
- print 'wait for client connect...'
-
- while True:
- cltSock, cltAddr = sock.accept()
- t = threading.Thread(target = offerServer, args=(cltSock,))
- t.setDaemon(True)
- t.start()
- sleep(1)
第一个是服务端,后三个是客户端,由此可见一个服务器可以为多个客户端提供连接服务,具有一定的并发性,但是据说python的多线程内部是单线程轮询的,所以这虽然提
供了并发连接,但效率不会太好