rainbow-ran

一、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,p2 server)

四、代码实现(版本二)

服务端客户端互发消息

server

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

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,p2 server)

分类:

技术点:

相关文章:

  • 2021-08-29
  • 2021-12-05
  • 2021-06-30
  • 2021-07-31
  • 2021-12-16
  • 2021-09-05
  • 2021-08-08
  • 2021-12-10
猜你喜欢
  • 2021-10-02
  • 2021-11-11
  • 2021-12-10
  • 2021-11-30
  • 2021-11-05
  • 2021-11-27
相关资源
相似解决方案