socket针对tcp编程,

用于客户端和服务端之间的数据交互。

1、基本代码框架如下:

特点:

1)双向通信功能:服务端、客户端都可以发送和接收数据

2)accept和recv是阻塞的

 

2、一个客户端通信的代码

1)服务端

'''
总结:
1、服务端要先启动,不然客户端启动后,找不到服务端的地址,会报错。
2、服务端启动后,阻塞到accept,等待有客户端连接。当有客户端连接以后,会阻塞到recv,直到收到客户端的消息。
3、accept和recv方法会阻塞,直到客户端或服务端执行了某操作,形成你来我往的通信。
4、发送数据需要将数据编码(encode)成bytes类型,接收到的数据需要解码
'''

import socket

server = socket.socket()
server.bind(('127.0.0.55', 8083))  # 绑定服务器地址 + 端口
server.listen()  # 监听

sk, addr = server.accept()  # 服务器与客户端建立连接。阻塞的,如果没有建立连接,就一直等待在这儿。如果想一个服务器与多个客户端建立连接,需要使用多线程。
print('客户0连接成功')
while True:  # 通过循环,取大于1024的数据,即:将大于1024的数据接收完成
    '''实现双向通信'''
    sk.send('Welcome to server!'.encode('utf8'))  # 连接成功后服务器向客户端发送信息,利用accept到的sk
    temp_data = sk.recv(1024)  # recv方法是阻塞的。1024是默认的,表示一次接收的最大数据长度,可以省略。可以设置为其他值,最大值根据操作系统的不同,由TCP协议定。
    print(temp_data.decode('utf8'))  # 将接收的bytes数据解码成string类型
    # input_data = input()
    input_data = '服务器向客户端传输的数据'
    sk.send(input_data.encode('utf8'))  # 发送数据需要将数据编码成bytes类型
sk.close()  # 关闭连接

2)客户端

import socket

client = socket.socket()
client.connect(('127.0.0.55', 8083))  # 连接服务器,连接成功以后,客户端会阻塞到recv
server_data = client.recv(1024)  # 等待客户端发送消息
print(f'Server response: {server_data.decode("utf8")}')

while True:
    # input_data = input('请输入要想服务器传输的数据:')
    input_data = '客户端0第一次传输的数据'
    client.send(input_data.encode('utf8'))
    server_data = client.recv(1024)
    print(f'Server response: {server_data.decode("utf8")}')
    break  # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。

 

3、多个客户端通信代码

 1)服务端

import socket
import threading


def client_sev(client_name, sk, addr):
    print(f'{client_name}连接成功')
    while True:  # 通过循环,取大于1024的数据,即:将大于1024的数据接收完成
        '''实现双向通信'''
        sk.send('Welcome to server!'.encode('utf8'))  # 连接成功后服务器向客户端发送信息,利用accept到的sk
        temp_data = sk.recv(1024)  # recv方法是阻塞的。1024是默认的,表示一次接收的最大数据长度,可以省略。可以设置为其他值,最大值根据操作系统的不同,由TCP协议定。
        print(temp_data.decode('utf8'))  # 将接收的bytes数据解码成string类型
        # input_data = input()
        input_data = f'服务器向{client_name}传输的数据'
        sk.send(input_data.encode('utf8'))  # 发送数据需要将数据编码成bytes类型
    sk.close()  # 关闭连接


server = socket.socket()
server.bind(('127.0.0.55', 8083))  # 绑定服务器地址 + 端口
server.listen()  # 监听
while True:
    sk, addr = server.accept()  # 使用多线程,服务端与多个客户端可以同时连接
    client_name = sk.recv(1024).decode('utf8')
    client_thread = threading.Thread(target=client_sev, args=(client_name, sk, addr, ))  # 建立多线程对象
    client_thread.start()  # 启动多线程
    # client_sev(client_name, sk)

2)客户端1

import socket

client = socket.socket()
client.connect(('127.0.0.55', 8083))  # 连接服务器,连接成功以后,客户端会阻塞到recv
client.send('客户0'.encode('utf8'))
server_data = client.recv(1024)  # 等待客户端发送消息
print(f'Server response: {server_data.decode("utf8")}')

while True:
    # input_data = input('请输入要想服务器传输的数据:')
    input_data = '客户0第一次传输的数据'
    client.send(input_data.encode('utf8'))
    server_data = client.recv(1024)
    print(f'Server response: {server_data.decode("utf8")}')
    break  # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。

3)客户端2...

import socket

client = socket.socket()
client.connect(('127.0.0.55', 8083))  # 连接服务器,连接成功以后,客户端会阻塞到recv
client.send('客户1'.encode('utf8'))
server_data = client.recv(1024)  # 等待客户端发送消息
print(f'Server response: {server_data.decode("utf8")}')

while True:
    # input_data = input('请输入要想服务器传输的数据:')
    input_data = '客户1第一次传输的数据'
    client.send(input_data.encode('utf8'))
    server_data = client.recv(1024)
    print(f'Server response: {server_data.decode("utf8")}')
    break  # 客户端的一次数据传输。可以通过输入不同数据一直传输给服务端。

 

posted on 2020-04-27 11:38  jaysonteng  阅读(378)  评论(0编辑  收藏  举报