python socket

2022-09-15  本文已影响0人  呦丶耍脾气

对象方法和属性

名 称 描 述
服务端 服务器套接字方法
s.bind(ADDR) 将地址(主机名、端口号对)绑定到套接字上
s.listen([backlog]) 设置并启动 TCP 监听器,如果指定backlog,则必须至少为0(如果低于0,则设置为0);
s.accept() 被动接受 TCP 客户端连接,一直等待直到连接到达(阻塞)
客户端 客户端套接字方法
s.connect() 主动发起 TCP 服务器连接
s.connect_ex() connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常
普通通用 普通的套接字方法
s.recv() 接收 TCP 消息
s.recv_into() 接收 TCP 消息到指定的缓冲区
s.send() 发送 TCP 消息
s.sendall() 完整地发送 TCP 消息
s.recvfrom() 接收 UDP 消息
s.recvfrom_into() 接收 UDP 消息到指定的缓冲区
s.sendto() 发送 UDP 消息
s.getpeername() 连接到套接字(TCP)的远程地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回给定套接字选项的值
s.setsockopt() 设置给定套接字选项的值
s.shutdown() 关闭连接
s.close() 关闭套接字
s.detach() 在未关闭文件描述符的情况下关闭套接字,返回文件描述符
s.ioctl() 控制套接字的模式(仅支持 Windows)
阻塞 面向阻塞的套接字方法
s.setblocking() 设置套接字的阻塞或非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 获取阻塞套接字操作的超时时间
文件方法 面向文件的套接字方法
s.fileno() 套接字的文件描述符
s.makefile() 创建与套接字关联的文件对象
属性 数据属性
s.family 套接字家族
s.type 套接字类型
s.proto 套接字协议

创建服务和客户端

创建TCP服务

s = socket()       #  创建服务器套接字
s.bind(ADDR)       #  套接字与地址绑定
s.listen()         #  监听连接
while True:         #  服务器无限循环
  c = s.accept()    #  接受客户端连接
  comm_loop:          #  通信循环
  c.recv()/cs.send() #  对话(接收 / 发送)
  c.close()          #  关闭客户端套接字
s.close()          #  关闭服务器套接字 # (可选)

示例

import socket  # 导入 socket 模块

s = socket.socket()  # 创建 socket 对象
host = socket.gethostname()  # 获取本地主机名
port = 12345  # 设置端口
s.bind((host, port))  # 绑定端口

s.listen(5)  # 等待客户端连接
while True:
    c, addr = s.accept()  # 建立客户端连接
    print('连接地址:', addr)
    c.send('今天天气真好/哈哈'.encode(encoding="UTF-8"))
    c.close()  # 关闭连接
s.close()

创建 TCP 客户端

s = socket()       #  创建客户端套接字
s.connect()        #  尝试连接服务器
comm_loop:          #  通信循环
s.send()/cs.recv() #  对话(发送 / 接收)
s.close()          #  关闭客户端套接字

示例

import socket  # 导入 socket 模块

s = socket.socket()  # 创建 socket 对象
host = socket.gethostname()  # 获取本地主机名
port = 12345  # 设置端口号
s.connect((host, port))
str1 = s.recv(1024)
str1=str1.decode(encoding="gbk")
print(str1)
s.close()

创建UDP服务

s = socket()       #  创建服务器套接字
s.bind(ADDR)       #  套接字与地址绑定
while True:         #  服务器无限循环
  s.sendto()         #  发送 
  s.recvfrom()       #  接收
  s.close()          #  关闭服务器套接字 # (可选)

创建 UDP 客户端

cs = socket()       #  创建客户端套接字
comm_loop:          #  通信循环
cs.sendto()         #  发送 
cs.recvfrom()       #  接收
cs.close()          #  关闭客户端套接字

demo

#server.py 打开终端先运行
import socket
from time import ctime
import json
import time
#HOST = ''
HOST = socket.gethostname()
PORT = 12346
ADDR = (HOST, PORT)
BUFFSIZE = 1024
MAX_LISTEN = 5
ENCODING = 'utf-8'


def tcpServer():
    # TCP服务
    # with socket.socket() as s:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        # 绑定服务器地址和端口
        s.bind(ADDR)
        # 启动服务监听
        s.listen(MAX_LISTEN)
        print('等待用户接入。。。。。。。。。。。。')
        while True:
            # 等待客户端连接请求,获取connSock
            conn, addr = s.accept()
            print('警告,远端客户:{} 接入系统!!!'.format(addr))
            with conn:
                while True:
                    print('接收请求信息。。。。。')
                    # 接收请求信息
                    data = conn.recv(BUFFSIZE)
                    print('data=%s' % data)
                    print('接收数据:{!r}'.format(data.decode(ENCODING)))
                    if data.decode(ENCODING) == 'q':
                        print('当前用户退出,等待下个用户')
                        break
                    # 发送请求数据
                    conn.send(data)
                    print('发送返回完毕!!!')
            conn.close()
        s.close()

# 创建UDP服务
def udpServer():
    # 创建UPD服务端套接字
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        # 绑定地址和端口
        s.bind(ADDR)
        # 等待接收信息
        while True:
            print('UDP服务启动,准备接收数据。。。')
            # 接收数据和客户端请求地址
            data, address = s.recvfrom(BUFFSIZE)

            if not data:
                break

            print('接收请求信息:{}'.format(data.decode('utf-8')))

            s.sendto(b'i am udp,i got it', address)

        s.close()

if __name__ == '__main__':

    while True:
        choice = input('input choice t-tcp or u-udp:(t/u)')

        if choice != 't' and choice != 'u':
            print('please input t or u,ok?')
            continue

        if choice == 't':
            print('execute tcpsever')
            tcpServer()
        else:
            print('execute udpsever')
            udpServer()
#client.py 打开终端先运行server.py后运行client.py,可以开启多个
import socket

from time import ctime
HOST = socket.gethostname()
PORT = 12346
ADDR = (HOST, PORT)
ENCODING = 'utf-8'
BUFFSIZE = 1024


def tcpClient():
    # 创建客户套接字
    with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as s:
        # 尝试连接服务器
        s.connect(ADDR)
        print('连接服务成功!!')
        #通信循环
        while True:
            inData = input('pleace input something:')
            if inData == 'q':
                s.send(inData.encode(encoding=ENCODING))
                break
            # 发送数据到服务器
            inData = '[{}]:{}'.format(ctime(), inData)

            s.send(inData.encode(encoding=ENCODING))
            print('发送成功!')

            # 接收返回数据
            outData = s.recv(BUFFSIZE)
            print('返回数据信息:{!r}'.format(outData))
        # 关闭客户端套接字
        s.close()


def udpClient():
    # 创建客户端套接字
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        while True:
            # 发送信息到服务器
            data = input('please input message to server or input \'quit\':')
            if data == 'quit':
                break
            data = '[{}]:{}'.format(ctime(), data)

            s.sendto(data.encode('utf-8'), ADDR)

            print('send success')

            # 接收服务端返回信息
            recvData, addrs = s.recvfrom(BUFFSIZE)

            print('recv message : {}'.format(recvData.decode('utf-8')))

        # 关闭套接字
        s.close()


if __name__ == '__main__':

    while True:
        choice = input('input choice t-tcp or u-udp or q-quit:')
        if choice == 'q':
            break
        if choice != 't' and choice != 'u':
            print('please input t or u,ok?')
            continue

        if choice == 't':
            print('execute tcpsever')
            tcpClient()
        else:
            print('execute udpsever')
            udpClient()
上一篇下一篇

猜你喜欢

热点阅读