电赛学习3 使用socket进行简单网络通信

  • Post author:
  • Post category:其他



网络通信也就是说需要两个或多个设备,分为server端(服务端)与client端(客户端)


简单的通信:

对于服务端来说,需要接收消息

首先要确定与谁通信,即确定IP地址与端口号

IP = '127.0.0.1'
# 端口号
PORT = 9999
# 定义一次从socket缓冲区最多读入512个字节
BUFLEN = 512

然后使用TCP协议

# 实例化一个socket对象
# 调用socket中的socket()来创建一个listenSocket,主要用户进行监听
# socket()有两个参数
# 第一个参数AF_INET表示socket网络层使用IP协议
# 第二参数SOCK_STREAM表示该socket传输层使用tcp协议
listenSocket = socket(AF_INET, SOCK_STREAM)

接着对IP地址与端口号进行绑定

# bind()函数将我们创建的这个socket关联到我们主机的某一个网卡(网络接口,network interface)和端口上
# socket绑定地址和端口
listenSocket.bind((IP, PORT))

等待连接(如果没有客户端连接的话,程序会一直停在accept函数的这一行,直至有客户端与其连接)

# 使socket处于监听状态,等待客户端的连接请求
# 参数5表示最多接受多少个等待连接的客户端
listenSocket.listen(5)
print(f'服务器端启动成功,在{PORT}端口等客户端的连接.....')

dataSocket, addr = listenSocket.accept()
print('接受一个客户端连接:', addr)

关闭

# 服务端也调用close(),关闭socket
dataSocket.close()
listenSocket.close()

如果有客户端连接,则接收信息

while True:
    # 尝试读取对方发送的消息
    # BUFFEN指定从接受收缓存里最多读取多少字节
    recved = dataSocket.recv(BUFLEN)

    # 如果返回空bytes,表示对方关闭了连接
    # 退出循环,结束消息收发
    if not recved:
        break

    # 读取的字节数据是bytes 类型,需要解码为字符串
    info = recved.decode()
    print(f'收到对方信息: {info}')

    # 发送的数据类型必须为bytes,所以要编码
    dataSocket.send(f'服务端收到了信息 {info}'.encode())

完整代码:

# 导入socket库
# import socket
from socket import *

# 主机地址为0.0.0.0,表示绑定本机所有网络接口IP地址
# 等待客户端来连接
IP = '127.0.0.1'
# 端口号
PORT = 9999
# 定义一次从socket缓冲区最多读入512个字节
BUFLEN = 512

# 实例化一个socket对象
# 调用socket中的socket()来创建一个listenSocket,主要用户进行监听
# socket()有两个参数
# 第一个参数AF_INET表示socket网络层使用IP协议
# 第二参数SOCK_STREAM表示该socket传输层使用tcp协议
listenSocket = socket(AF_INET, SOCK_STREAM)

# bind()函数将我们创建的这个socket关联到我们主机的某一个网卡(网络接口,network interface)和端口上
# socket绑定地址和端口
listenSocket.bind((IP, PORT))

# 使socket处于监听状态,等待客户端的连接请求
# 参数5表示最多接受多少个等待连接的客户端
listenSocket.listen(5)
print(f'服务器端启动成功,在{PORT}端口等客户端的连接.....')

dataSocket, addr = listenSocket.accept()
print('接受一个客户端连接:', addr)

while True:
    # 尝试读取对方发送的消息
    # BUFFEN指定从接受收缓存里最多读取多少字节
    recved = dataSocket.recv(BUFLEN)

    # 如果返回空bytes,表示对方关闭了连接
    # 退出循环,结束消息收发
    if not recved:
        break

    # 读取的字节数据是bytes 类型,需要解码为字符串
    info = recved.decode()
    print(f'收到对方信息: {info}')

    # 发送的数据类型必须为bytes,所以要编码
    dataSocket.send(f'服务端收到了信息 {info}'.encode())

# 服务端也调用close(),关闭socket
dataSocket.close()
listenSocket.close()

对于客户端来说,需要发送消息

定义IP地址与端口,与服务端一致

IP='127.0.0.1'
SERVER_PORT=9999
BUFLEN=512

实例化对象

# 实例化一个sokcet对象,指明协议
dataSocket = socket(AF_INET,SOCK_STREAM)

调用对象中的connect方法,尝试连接服务端

# 连接服务端socket
dataSocket.connect((IP,SERVER_PORT))

如果连接成功,则

while True:
    # 从终端读入用户输入的字符串
     toSend = input('>>> ')
     if toSend =='exit':
           break
     dataSocket.send(toSend.encode())
     recved = dataSocket.recv(BUFLEN)
    #如果返回空bytes,表示对方关闭了连接
     if not recved:
        break
    # 打印读取的信息
     print(recved.decode())

关闭

dataSocket.close()

完整代码:

from socket import *
IP='127.0.0.1'
SERVER_PORT=9999
BUFLEN=512

# 实例化一个sokcet对象,指明协议
dataSocket = socket(AF_INET,SOCK_STREAM)

# 连接服务端socket
dataSocket.connect((IP,SERVER_PORT))

while True:
    # 从终端读入用户输入的字符串
     toSend = input('>>> ')
     if toSend =='exit':
           break
     dataSocket.send(toSend.encode())
     recved = dataSocket.recv(BUFLEN)
    #如果返回空bytes,表示对方关闭了连接
     if not recved:
        break
    # 打印读取的信息
     print(recved.decode())

dataSocket.close()



版权声明:本文为JYHZZ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。