python中socket编程-------服务端

Socket APT 概览

python的socket模块提供了Berkeley socket API接口,这将会在我们这个教程里使用和讨论到

 

主要的用到的 Scoket API 函数和方法有下面这些:

`  socket()

` bind()

` liste()

` accept()

` connect()

` connect_ex()

` send()

` recv()

` close()

Python 提供了和C 语言一致且方便的API

下面的就是服务器代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/4/15 0015 17:27
# @Author  : Willpower-chen
# @Site    : 
# @File    : Socket_server.py
# @Software: PyCharm
import socket
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
    s.bind(( HOST , PORT ))
    s.listen()
    conn, addr = s.accept()
    print(conn)
    with conn:
        print("连接于",addr)
        while True:
            data = conn.recv(1024)
            print("客户端发",data)
            if not data:
                break
            conn.sendall(data)

让我们来看一下API调用以及发生了什么

 

(1): socket.socket()创建了一个socket对象, 并且支持context manager type,你可以使用with语句,这样就可以不用再手动调用s.close()来关闭socket了

with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
       pass

(2): 调用socket()时传入的socket地址族参数 socket.AF_INET 表示因特网 IPv4 地址族,SOCK_STREAM表示使用了TCP的socket类型,协议将被用来在网络中传输消息

bind()方法用来关联socket 到指定的网络接口(IP 地址)和端口号:

HOST = '127.0.0.1'
PORT = 65432

#...

s.bind( (HOST,PORT) )

bind方法的入参取决于socket的地址族,在这个例子中我们使用了socket.AF_INET ( IPv4 ),它将返回两个元素的元组 (host,port)

host可以是主机名称,IP地址,空字符串,如果使用IP 地址, host就应该是IPv4 格式的字符串, 127.0.0.1 是标准的IPv4地址,端口号应该在1-65535之间的证书(0是保留的),这个证书就是用来接受客户端链接的TCP端口号, 如果端口号小于 1024, 有的操作系统会要求管理员权限

(3):继续看上面的服务器代码示例, listen() 方法调用使 服务器可以接受 连接请求,这使它成为一个[监听中] 的socket

s.listen()
conn, addr = s.accept()

listen() 方法有一个backlog 参数, 它指定在拒绝新的连接之前系统将允许使用的未接受的连接数量, 从 Python 3.5 开始, 这是可选参数. 如果不指定, python 将取一个默认值,如果你的服务器需要同时接受很多连接请求, 增加backlog 参数的值可以加大等待连接请求队列的长度, 最大长度取决于操作系统.

 

accept()方法阻塞并等待传入连接, 当一个客户端连接时, 它将返回一个新的 socket对象, 对象中有表示当前连接的conn 和一个由主机,端口号组成的IPv4/v6 连接的元组 

 

这里必须明白我们通过调用 accept方法拥有了一个新的socket对象 , 这件事非常重要, 因为你将用这个socket对象和客户端进行通信, 和监听一个socket 不同的是后者只用来接受新的连接请求

conn, addr = s.accept()
    with conn:
        print("连接于",addr)
        while True:
            data = s.recv(1024)
            print("客户端发",data)
            if not data:
                break
            conn.sendall(data)

从accept 获取的客户端socket 连接的对象 conn, 使用一个无限 while 循环来阻塞调用 conn.recv() ,无论客户端传过来什么数据都会使用 conn.sendall()打印出来

 

如果conn.recv() 方法返回一个空的 byte 对象(b'')然后关闭客户端连接, 循环结束,  with 语句 和conn 语句一起使用时,通信结束的时候会自动关闭 socket 连接.

这样就完成了服务端的配置.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值