socket实现TCP简单循环通信(Python)

一、socket通信过程

TCP服务器端创建套接字 --> 绑定IP地址和端口 --> 监听客户端连接请求 --> 接收客户端连接(建立客户端连接) --> 阻塞直到有客户端连接 --> 处理请求(通信循环) --> 关闭连接 --> 关闭套接字

TCP客户端创建套接字 --> 连接服务端IP以及端口 --> 处理请求(通信循环) --> 关闭套接字

二、套接字函数

1.服务端套接字函数

s.bind(address)

将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址。

s.listen(backlog)

开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。

s.accept()

接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

2.客户端套接字函数

s.connect(address)

连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

3.公共套接字函数

s.recv(bufsize[,flag])

接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。

s.send(string[,flag])

发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。

s.close()

关闭套接字。

三、代码实现(版本一)

实现效果:客户端单方面发送消息,服务端显示客户端发送的消息

server.py

import socket

# 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定ip地址与端口号
sock.bind(('127.0.0.1', 8080))

# 建立监听,最大连接数为5个
sock.listen(5)

# 接收客户端的连接
conn, client_addr = sock.accept()

# 通讯循环
while True:
    # 接收消息
    msg = conn.recv(1024)  # 最大接收字节数为1024
    if not msg:
        continue
    print('client is sending: ' + msg.decode('utf-8'))

# 断开连接
conn.close()

# 关闭套接字
sock.close()

client.py

import socket

# 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端
sock.connect(('127.0.0.1', 8080))

# 建立通讯循环
while True:
    msg = input('Enter your message: ')
    if msg == 'quit':
        print('communication ended')
        break
    sock.send(msg.encode('utf-8'))  # Mac操作系统使用utf-8编码方式

# 断开连接
sock.close()

先运行server,再运行client

运行效果:(p1 client.py,p2 server.py)

四、代码实现(版本二)

服务端客户端互发消息

server.py

import socket

# 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定ip地址与端口号
sock.bind(('127.0.0.1', 8081))

# 建立监听,最大连接数为5个
sock.listen(5)

# 接收客户端的连接
conn, client_addr = sock.accept()

# 通讯循环
while True:
    # 接收消息
    msg = conn.recv(1024)  # 最大接收字节数为1024
    if not msg:
        continue
    print('client is sending: ' + msg.decode('utf-8'))
    reply = input('reply: ')
    conn.send(reply.encode('utf-8'))

# 断开连接
conn.close()

# 关闭套接字
sock.close()

client.py

import socket

# 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端
sock.connect(('127.0.0.1', 8081))

# 建立通讯循环
while True:
    msg = input('Enter your message: ')
    if msg == 'quit':
        print('communication ended')
        break
    sock.send(msg.encode('utf-8'))  # Mac操作系统使用utf-8编码方式
    reply = sock.recv(1024)
    print('server is sending: ' + reply.decode('utf-8'))

# 断开连接
sock.close()

先运行server,再运行client

运行效果:(p1 client.py,p2 server.py)


猜你喜欢

转载自www.cnblogs.com/rainbow-ran/p/12535999.html
今日推荐