Python Socket 在网络通讯方面的能力是非常强大的,并且代码量也是非常少的,学起来也是非常的容易,Python Socket在连接方面有TCP和UDP两种,本文主要介绍使用 Python 进行TCP Socket 网络编程,在这之前,你需要具备Python语法基础,具体教程可以网上搜一下,并不是很难。
小试牛刀
客户端编程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#coding:utf8 from socket import * HOST = '127.0.0.1' 连接地址 PORT = 8888 #连接端口 BUFSIZ = 1024 ADDR = (HOST, PORT) #将连接信息放进元组 try: tcpCliSock = socket(AF_INET, SOCK_STREAM) #配置连接方式 tcpCliSock.connect(ADDR) #开始连接 print tcpClisock.recv(1024) #接收服务端发来的数据 except: print "connect fail!" exit(0) try: tcpCliSock.close() #关闭连接 except: exit(0) |
看上面的代码中 在配置连接方式的时候参数1使用了AF_INET,这个参数代表 Internet 进程间通信,如果改为AF_UNIX则用于同一台机器进程间通信,SOCK_STREAM是套接字类型,可以是 SOCKET_STREAM(流式套接字,主要用于 TCP 协议)或者SOCKET_DGRAM(数据报套接字,主要用于 UDP 协议)。
在连接和关闭连接的地方都需要抛出异常,防止连接失败程序崩溃。
服务端编程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#coding:utf8 import socket # 导入 socket 模块 s = socket.socket() # 创建 socket 对象 host ='127.0.0.1' port = 8888 # 设置端口 s.bind((host, port)) # 绑定端口 s.listen(5) # 等待客户端连接 while True: c, addr = s.accept() # 建立客户端连接。 print '连接地址:', addr c.send('连接成功') c.close() # 关闭连接 |
上面说的都是简单的连接,不过这种连接时单线程的,每次只可以连接一个客户端,若有第二个客户端进行请求连接时必须等待上一次此连接的断开,有时候这种方式不适用,所以有了下面的多线程的连接方式。
小有成就
若想多个客户端就行连接,关键的地方在于服务端,对服务端进行多线程的编程即可,在python中有个包叫:SocketServer,直接写个类继承它里面的BaseRequestHandler类,然后实现handle方法即可,下面看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#conding:utf8 import SocketServer import traceback from time import ctime import math # HOST = "10.141.22.44" HOST = "127.0.0.1" PORT = 8888 ADDR = (HOST, PORT) #继承SocketServer.BaseRequestHandler class MyRequestHandler(SocketServer.BaseRequestHandler): def handle(self): conn = self.request while True: #recv接收不到数据会抛出异常 try: data = conn.recv(1024) except: print "lost one conn" break if (data == 'exit') or (not data): print "lost conn" break #输出客户端地址和客户端发送过来的数据 print "RECV from ", self.client_address print data #启动多线程的socket tcpServ = SocketServer.ThreadingTCPServer(ADDR, MyRequestHandler) print 'waiting for connection' try: #等待处理请求 tcpServ.serve_forever() except: exit(0) |
这种多线程的socket每次有客户端请求都会调用一次handle方法,所以,只要将处理数据的代码写在handel中调用即可。相对单客户端的编程来说这种方式的代码反而简单一些,