【SOCEKT】Python基于socket的通信

22 阅读2分钟

先简单给大家介绍一下什么是socket,socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信。

我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如浏览网页、QQ 聊天、收发 email 等等

简单的说:socket可以实现不同主机间进行通信

socket通信的条件:IP和端口

ip相信大家都陌生了,每一台主机都有一个ip,不同主机之间通信的首要前提就是ip可以互访,此外还有一个条件就是端口,比如我们经常听到的80端口,3306端口,8080端口等。

主机中的数据是通过端口发送和接收,需要将对应端口打开才能进行通信。

形象比喻

ip相当于家庭地址,端口相当于门或者窗户

例子:(主机A)快递员要想将快递(数据)送到你手中(另一台主机B),需要知道你家的地址(主机B的ip),到你家门口后,需要你打开门(主机B的端口)才能拿到快递(数据)。

这里需要分服务端和客户端,客户端发送(主机A),服务器接收(主机B),当然了,每一台主机可以充当两个角色(既是客户端,也是服务器),这样就可以实现两台主机之间相互发送和接收。

看到这里之后,相信大家都清楚socket在实现不同主机之间通信的大概意思了,下面开始Python代码实现。

客户端 client.py

'''客户端'''

from socket import *

username = input('PLEASE ENTER USERNAME: ')

# 1. 创建套接字
tcp_socket = socket(AF_INET, SOCK_STREAM)

# 2. 转呗连接服务器,建立连接
server_address = ('192.168.110.155')
server_port = 8080
tcp_socket.connect((server_address, server_port))

while True:

# 3. 准备需要传送的数据
    send_message = input('Enter your message: ')
    if send_message == 'exit':
        break
    tcp_socket.send(send_message.encode('utf-8'))


# 4. 从服务器上接收数据
    received_message = tcp_socket.recv(1024)
    print('SERVER RESPONSE: ' + received_message.decode('utf-8'))

# 5. 关闭连接
tcp_socket.close()

主机端 server.py

'''主机端'''

from socket import *
import time

# 1. 创建接收
tcp_server = socket(AF_INET, SOCK_STREAM)

# 2. 绑定 IP, PORT
ip_addr = ('192.168.110.155', 8080)
tcp_server.bind(ip_addr)

# 3. 启动被动连接 / 多少个客户端可以连接
tcp_server.listen(128)

# 备注: 使用socket创建的套接字默认的属性是主动的。调用listen的属性是被动的,这样就可以被别人连接上了。


# 4. 创建接收
client_socket, client_addr = tcp_server.accept()

while True:

    # 5. 接收对方发送过来的数据
    from_client_msg = client_socket.recv(1024)
    now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    print(str(now_time) + ' ' + 'CLIENT: ', from_client_msg.decode('utf-8'))

    # 6. 发送数据给客户端
    send_msg = client_socket.send('THIS IS BASE!'.encode('utf-8'))

# 7. 关闭socket
client_socket.close()