当前位置:天才代写 > tutorial > Python教程 > python socket编程入门(编写server实例)

python socket编程入门(编写server实例)

2017-11-02 08:00 星期四 所属: Python教程 浏览:40

python 编写server的步调:

1. 第一步是建设socket工具。挪用socket结构函数。如:

socket = socket.socket( family, type )

family参数代表地点家属,可为AF_INET或AF_UNIX。AF_INET家属包罗Internet地点,AF_UNIX家属用于同一台呆板上的历程间通信。

type参数代表套接字范例,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。

2. 第二步是将socket绑定到指定地点。这是通过socket工具的bind要领来实现的:

socket.bind( address )

由AF_INET所建设的套接字,address地点必需是一个双元素元组,名目是(host,port)。host代表主机,port代表端标语。假如端标语正在利用、主机名不正确或端口已被保存,bind要领将激发socket.error异常。

3. 第三步是利用socket套接字的listen要领吸收毗连请求。

socket.listen( backlog )

backlog指定最多答允几多个客户毗连随处事器。它的值至少为1。收到毗连请求后,这些请求需要列队,假如行列满,就拒绝请求。

4. 第四步是处事器套接字通过socket的accept要领期待客户请求一个毗连。

connection, address = socket.accept()

调 用accept要领时,socket会时入“waiting”状态。客户请求毗连时,要领成立毗连并返回处事器。accept要领返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket工具,处事器必需通过它与客户通信;第二个元素 address是客户的Internet地点。

5. 第五步是处理惩罚阶段,处事器和客户端通过send和recv要领通信(传输 数据)。处事器挪用send,并回收字符串形式向客户发送信息。send要领返回已发送的字符个数。处事器利用recv要领从客户吸收信息。挪用recv 时,处事器必需指定一个整数,它对应于可通过本次要领挪用来吸收的最大数据量。recv要领在吸收数据时会进入“blocked”状态,最后返回一个字符 串,用它暗示收到的数据。假如发送的数据量高出了recv所答允的,数据会被截短。多余的数据将缓冲于吸收端。今后挪用recv时,多余的数据会从缓冲区 删除(以及自上次挪用recv以来,客户大概发送的其它任何数据)。

6. 传输竣事,处事器挪用socket的close要领封锁毗连。

python编写client的步调:

1. 建设一个socket以毗连处事器:socket = socket.socket( family, type )

2.利用socket的connect要领毗连处事器。对付AF_INET家属,毗连名目如下:

socket.connect( (host,port) )

host代表处事器主机名或IP,port代表处事器历程所绑定的端标语。如毗连乐成,客户就可通过套接字与处事器通信,假如毗连失败,会激发socket.error异常。

3. 处理惩罚阶段,客户和处事器将通过send要领和recv要领通信。

4. 传输竣事,客户通过挪用socket的close要领封锁毗连。

下面给个简朴的例子:

server.py

if __name__ == '__main__':
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost', 8001))
    sock.listen(5)
    while True:
        connection,address = sock.accept()
        try:
            connection.settimeout(5)
            buf = connection.recv(1024)
            if buf == '1':
                connection.send('welcome to server!')
            else:
                connection.send('please go out!')
        except socket.timeout:
            print 'time out'
        connection.close()

client.py

if __name__ == '__main__':
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('localhost', 8001))
    import time
    time.sleep(2)
    sock.send('1')
    print sock.recv(1024)
    sock.close()

在终端运行server.py,然后运行clien.py,会在终端打印“welcome to server!"。假如变动client.py的sock.send('1')为其它值在终端会打印”please go out!“,变动time.sleep(2)为大于5的数值, 处事器将会超时。

 

    关键字:


天才代写-代写联系方式