Python

Python:基于 Socket 网络编程 + threadin

2020-07-27  本文已影响0人  dex0423

1. Socket 协议

1.1. 什么是 Socket 协议

1.2. Socket 分类

2. client & server 通信模型

import socket
#创建服务端的socket对象socketserver
socketserver = socket.socket(
    socket.AF_INET,             # AF_INET 表示服务器到服务器通信
    socket.SOCK_STREAM          # SOCK_STREAM 表示 socket 连接
)
host = '127.0.0.1'
port = 8888
#绑定地址(包括ip地址会端口号)
socketserver.bind((host, port))
#设置监听
socketserver.listen(5)
#等待客户端的连接
#注意:accept()函数会返回一个元组
#元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)
clientsocket,addr = socketserver.accept()

#while循环是为了能让对话一直进行,直到客户端输入q
while 1:

    #接收客户端的请求
    recvmsg = clientsocket.recv(1024)
    #把接收到的数据进行解码
    strData = recvmsg.decode("utf-8")
    #判断客户端是否发送q,是就退出此次对话
    if strData=='q':
        break
    print("收到:"+strData)
    msg = input("回复:")
    #对要发送的数据进行编码
    clientsocket.send(msg.encode("utf-8"))

socketserver.close()
import socket
#创建一个客户端的socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#设置服务端的ip地址
host = "127.0.0.1"
#设置端口
port = 8888
# 连接服务端
client.connect((host, port))

#while循环是为了保证能持续进行对话
while 1:
    #输入发送的消息
    sendmsg = input("请输入:")
    #如果客户端输入的是q,则停止对话并且退出程序
    if sendmsg=='q':
        break

    sendmsg = sendmsg
    #发送数据,以二进制的形式发送数据,所以需要进行编码
    client.send(sendmsg.encode("utf-8"))
    msg = client.recv(1024)
    #接收服务端返回的数据,需要解码
    print(msg.decode("utf-8"))
#关闭客户端
client.close()

-- client:

请输入:你好,server

-- server:

收到:你好,server
回复: 你好,client,server 收到

-- client:

你好,client,server 收到

3. 构建多 client 用户通信模型

import socket
import threading


#创建服务端的socket对象socketserver
socketserver = socket.socket(
    socket.AF_INET,             # AF_INET 表示服务器到服务器通信
    socket.SOCK_STREAM          # SOCK_STREAM 表示 socket 连接
)
host = '127.0.0.1'
port = 8888
#绑定地址(包括ip地址会端口号)
socketserver.bind((host, port))
#设置监听
socketserver.listen(5)

def handle_sock(sock, addr):
    while 1:
        # 接收客户端的请求
        recvmsg = clientsocket.recv(1024)
        # 把接收到的数据进行解码
        strData = recvmsg.decode("utf-8")
        # 判断客户端是否发送q,是就退出此次对话
        if strData == 'q':
            break
        print("收到:" + strData)
        msg = input("回复:")
        # 对要发送的数据进行编码
        clientsocket.send(msg.encode("utf-8"))


#while循环是为了能让对话一直进行,直到客户端输入q
while 1:
    # 等待客户端的连接
    # 注意:accept()函数会返回一个元组
    # 元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)
    clientsocket, addr = socketserver.accept()
    client_thread = threading.Thread(target=handle_sock, args=(clientsocket, addr))
    client_thread.start()

socketserver.close()
import socket
#创建一个客户端的socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#设置服务端的ip地址
host = "127.0.0.1"
#设置端口
port = 8888
# 连接服务端
client.connect((host, port))

#while循环是为了保证能持续进行对话
while True:
    #输入发送的消息
    sendmsg = input("请输入:")
    #如果客户端输入的是q,则停止对话并且退出程序
    if sendmsg=='q':
        break

    sendmsg = sendmsg
    #发送数据,以二进制的形式发送数据,所以需要进行编码
    client.send(sendmsg.encode("utf-8"))
    msg = client.recv(1024)
    #接收服务端返回的数据,需要解码
    print(msg.decode("utf-8"))
#关闭客户端
client.close()
上一篇下一篇

猜你喜欢

热点阅读