TCP Socket的客户端、服务端实现方式

Posted by comeyke on 09-07,2019

一、Socket协议

Socket是对TCP/IP协议的封装,它是一种通信协议,是应用层与传输层之间的接口。Socket协议是一种TCP/IP协议族的一部分,用于在互联网中建立客户端和服务器之间的通信。它建立在IP协议之上,通过TCP或UDP协议进行数据传输。其中,TCP协议提供了可靠的、面向连接的通信方式,能够保证数据的正确传输;而UDP协议则是一种无连接的协议,它不保证数据的正确传输,但可以提供更快的传输速度。
基于Socket,可以实现许多不同的通信协议,常见的协议有TCP协议,UDP协议,HTTP协议,HTTPS协议,FTP协议,SMTP协议,DNS协议,SSH协议,Telnet协议,还有许多其他的协议可以使用Socket接口来实现。
Socket通信的基本流程如下:
1、创建Socket:在应用程序中创建一个Socket对象,指定协议(如TCP或UDP)和端口号。
2、绑定Socket:将Socket绑定到本地IP地址和端口号。
3、监听连接:如果是一个服务器,监听来自客户端的连接请求;如果是一个客户端,向服务器发起连接请求。
4、接收/发送数据:在Socket连接建立后,可以接收和发送数据。
5、关闭Socket:完成数据传输后,关闭Socket连接。

二、Pyhton实现

下面我们使用python自带的socket库进行TCP Socket的客户端、服务端的实现。

import socket


def create_tcp_socket(host, port):   
    # 创建tcp socket 对象 / socket 的实例化
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # SOCK_STREAM 是tcp的套接字

    # 绑定IP地址和端口号
    server_socket.bind((host, port)) # 元组格式

    # 监听连接
    server_socket.listen(1)
    print("Waiting for client connection...")

    while True:
        #  获取客户端连接
        client_socket, client_address = server_socket.accept()
        print("Client connected:", client_address)

        # 接收客户端消息
        try:
            while True:
                data = client_socket.recv(1024).decode("utf-8")  # tcp的消息接收用的是recv
                print("Received message:", data)
                if data == '周杰伦':
                    msg = '在练歌'
                elif data == '彭于晏':
                    msg = '在健身'
                else:
                    msg = '没消息'
                client_socket.sendall(msg.encode("utf-8"))  # tcp是发送用的是sendall
        except ConnectionAbortedError:
            client_socket.close()
            continue


if __name__ == '__main__':
    re_host = '127.0.0.1'
    re_port = 8995
    create_tcp_socket(re_host,re_port)

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_address = ("127.0.0.1",8995)

client_socket.connect(server_address)

client_socket.sendall('彭于晏'.encode("utf-8"))
res = client_socket.recv(1024).decode("utf-8")
print("第一次接口的回调数据:", res)

client_socket.sendall('吴亦凡'.encode("utf-8"))
res = client_socket.recv(1024).decode("utf-8")
print("第二次接口的回调数据:", res)

client_socket.sendall('周杰伦'.encode("utf-8"))
res = client_socket.recv(1024).decode("utf-8")
print("第三接口的回调数据:", res)

client_socket.close()