正在阅读:

Python Socket TCP网络编程

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中调用即可。相对单客户端的编程来说这种方式的代码反而简单一些,

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌