网络通信你怕不怕,相当厉害的技能!今天从《Python标准库》第5章直接跳到了第11章——网络通信。 然后实现了TCP/IP客户和服务器,以及UDP客户和服务器实现。网络部分之前有所了解,但是不够深入。应用层几个最具代表性的协议了解一下,不过年代久远,而且当时没有动手实践。今天最终实现了,也算是亡羊补牢?来记录下今天实现的东西
基于socket库实现。 书上代码如下
import socket import sys #Create a TCP/IP socket sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server_name = sys.argv[1] server_address = (server_name,10002) print >>sys.stderr,'starting up on %s port %s '%server_address sock.bind(server_address) sock.listen(1) while True: print >>sys.stderr,'waiting for a connection' connection,client_address = sock.accept() try: print >>sys.stderr,'connection from',client_address while True: data = connection.recv(16) print >>sys.stderr,'received "%s" ' % data if data: print >>sys.stderr,'sending data back to the client' connection.sendall(data) else: print >>sys.stderr,'no data from',client_address break finally: connection.close()这是服务器的,主体思想是先建立一个socket,然后绑定一个端口,然后监听。非常清楚,感谢之前各位已经造好轮子的dalao们。 顺便说下,书上所用端口是10000,我改成了10002,原因是会报错,socket error 10048 查了一下发现应该是端口被用了,所以改了 然后下面是客户的示例:
import socket import sys def get_constans(prefix): """Create a dictionary mapping socket module constants to their name """ return dict((getattr(socket,n),n) for n in dir(socket) if n.startswith(prefix) ) families = get_constans('AF_') types = get_constans('SOCK_') protocols = get_constans('IPPROTO_') sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server_address = (sys.argv[1],10002) sock.connect(server_address) try: message = 'Oh here is my first try to make a server and client.It is so cooooooooooool' sock.send(message) amount_received = 0 amount_expected = len(message) while amount_received<amount_expected: data = sock.recv(16) amount_expected += len(data) print >>sys.stderr,' received "%s" '