python可以利用socket库实现套接字编程。套接字编程通常分为server端和client端,编程时一般是先server再client,这是最正常的逻辑,因为功能是由server提供的,client必须根据server提供的规则来建立连接和发送消息。


server端的函数:

函数描述
s.bind(address)将套接字绑定到地址AF_INET,以元组(host,port)的形式表示地址.
s.listen(backlog)开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept()接受TCP连接并返回(conn,address,其中conn新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

服务器建立TCP连接的流程如下:

socket()创建套接字->

bind()绑定地址和端口->

listen()开始监听连接请求->

accept()接受连接请求,并返回一个新的套接字用于处理后续操作->

recv()和send()对数据进行收发->

新套接字和旧套接字依次close()->end


代码练习:

import socket

from time import ctime

HOST = ""

PORT = 10012

ADDR = (HOST,PORT)

BUFSIZE = 1024

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(ADDR)

s.listen(5)

while True:
    print "Waiting for connection..."
    conn,addr = s.accept()
    print "...connection from:",addr
    while True:
        data = conn.recv(BUFSIZE)
        if not data:
            break
        conn.send('[%s] %s'%(ctime(),data))
        print [ctime()],':',data
conn.close()
s.close()


客户端函数:

函数描述
s.connect(address)连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex(adddress)功能与connect(address)相同,但是成功返回0,失败返回errno的值。

客户端建立TCP连接的流程:

socket()创建套接字->

connection()请求建立连接->

recv()和send()对数据进行收发->

close()套接字断开连接->end

注意,客户端在建立连接后没有返回新的套接字


代码练习:

import socket
from time import ctime

HOST = 'localhost'
PORT = 10012
BUFSIZE = 1024
ADDR = (HOST,PORT)

tcpSock =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpSock.connect(ADDR)

while True:
    data = raw_input(">")
    if not data:
        break
    tcpSock.send(data)
    
    data = tcpSock.recv(BUFSIZE)
    
    if not data:
        break
    
    print data
   
tcpSock.close()

演示截图如下

客户端输入:

wKiom1UJjxCSQjnwAADCuuhd_xI045.jpg


服务器端:

wKioL1UJkDiRAsfGAADiDaFNcyw401.jpg