python基础_网络编程_socket

一、什么是socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

简单来说就是,socket 就像是一个门,从数据从本地传输至网络,或者从网络传输至本地,均需要通过这个门

 

 二、使用python 实现一个socket 客户端和服务端的例子

服务端代码:

import socket

# 创建一个服务端对象
server = socket.socket()
# 绑定服务端ip以及端口
server.bind(('192.168.0.105',8002))
# 设置服务端最大连接数
server.listen(5)

while True:
    # 等待客户端连接,连接成功则返回客户端的套接字对象conn,和客户端地址信息 addr ,数据通过客户端的套接字对象进行传输
    con,addr = server.accept()
    print('与客户端{}建立了连接通道'.format(addr[0]))
    while True:
        # 通过连接通道获取通信数据 (设置了 数据传输的最大长度:1024字节)
        data = con.recv(1024).decode('utf-8')    #收到的消息
        if data == 'exit':
            print('客户端{}关闭了当前连接通道'.format(addr[0]))
            break
        else:
            # 打印 获取到的数据
            print(data)
            # 服务端通过客户端的的套接字对象向客户端发送 数据
            con.send(('服务端收到消息{}'.format(data)).encode('utf-8'))
    con.close()

客户端代码:

import socket
# 创建一个客户端的sock 对象
client = socket.socket()

# 连接服务端
client.connect(('192.168.0.105',8002))

while True:
    req = input('输入要传给服务端的数据:')
    # 客户端通过客户端的套接字对象调用send方法 向服务端发送数据
    client.send(req.encode('utf-8'))
    if req == 'exit':
        break
    else:
         # 客户端通过客户端的套接字对象调用recv方法接收服务端数据
        res = client.recv(1024).decode('utf-8')
        print(res)
client.close()

流程:

 

 

注意点:

1、通信方式:

客户端和服务端连接成功后,其数据通信均是通过客户端套接字对象完成

2、流程中的阻塞状态有:

'''服务端阻塞状态'''
server.accept()     #服务端等待连接,连接成功才能继续执行
server.recv()      #服务端等待接收消息,接收成功才能继续执行


'''客户端阻塞状态'''

client.connect    #客户端等待连接成功,连接成功才能继续往下执行
client.recv()      #客户端等待接受数据,数据接收到了才能继续往下执行

 三、服务端通过多线程方式,实现一个服务端同时对接多个客户端

server 代码:

'''
通过多线程的方式 实现 一个服务端 同时对接 多个 客户端

'''

import socket,threading

def thread_server(conn,addr):
    while True:
        # 通过连接通道获取通信数据 (设置了 数据传输的最大长度:1024字节)
        data = conn.recv(1024).decode('utf-8')  # 收到的消息
        if data == 'exit':
            print('客户端{}关闭了当前连接通道'.format(addr[0]))
            break
        else:
            # 打印 获取到的数据
            print(data)
            # 服务端通过连接通道向客户端发送 数据
            conn.send(('服务端收到消息{}'.format(data)).encode('utf-8'))
    conn.close()


# 创建一个服务端对象
server = socket.socket()
# 绑定服务端ip以及端口
server.bind(('192.168.0.105',8005))
# 设置服务端最大连接数
server.listen(5)

while True:
    conn,addr = server.accept()
    t1 = threading.Thread(target=thread_server,args=(conn,addr))
    t1.start()

client 代码:

import socket
# 创建一个客户端的 对象
client = socket.socket()

# 客户端对象向服务端 发起连接
client.connect(('192.168.0.105',8005))

while True:
    req = input('输入要传给服务端的数据:')
    # 客户端直接调用send方法 向服务端发送数据
    client.send(req.encode('utf-8'))
    if req == 'exit':
        break
    else:
         # 客户端通直接接收服务端的通信数据
        res = client.recv(1024).decode('utf-8')
        print(res)
client.close()

 

posted @ 2021-11-12 15:48  昆虫白  阅读(84)  评论(0)    收藏  举报