Python Socket 实现TCP的服务端和客户端

270 阅读1分钟
  •        Python : 3.8.11
  •          OS : Ubuntu Kylin 20.04
  •       Conda : 4.10.1
  •     Pycharm : 2021.1.3

代码示例

tcp_server

"""
@Author : 行初心
@Date   : 10/12/21 7:11 PM
"""
import socket
import threading


def client_handle(client):
    message = client.recv(1024)
    print("message", message)
    client.send("server accept!".encode("utf-8"))
    client.close()


bind_ip = "127.0.0.1"
bind_port = 7778

# socket.AF_INET: 网络类型,IPv4
# socket.SOCK_STREAM: TCP
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# SOL_SOCKET:正在使用的socket
# socket.SO_REUSEADDR,1 : 意义和功能较多,用于重启socket_server时依然可以顺利bind
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server.bind((bind_ip, bind_port))

# 监听数量 3
server.listen(3)

while True:
    client, address = server.accept()
    print("client", client)
    print("address", address)

    client_thread = threading.Thread(target=client_handle, args=(client,))
    client_thread.start()

# This code is unreachable
server.close()

tcp_client

"""
@Author : 行初心
@Date   : 10/12/21 7:27 PM
"""
import socket

server_ip = "127.0.0.1"
server_port = 7778

# socket.AF_INET: 网络类型,IPv4
# socket.SOCK_STREAM: TCP 客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect((server_ip, server_port))

# TypeError: a bytes-like object is required, not 'str'
# client.send("hello world")

client.send("hello world".encode("utf-8"))

response = client.recv(1024)
print(response)

client.close()

运行效果

tcp_server

  • 使用IDE强行结束的tcp_server,所以会出现KeyboardInterrupt
/home/coder/anaconda3/envs/py38/bin/python /home/coder/PycharmProjects/pythonProject1/tcp_server.py
client <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7778), raddr=('127.0.0.1', 45876)>
address ('127.0.0.1', 45876)
message b'hello world'
Traceback (most recent call last):
  File "/home/coder/PycharmProjects/pythonProject1/tcp_server.py", line 33, in <module>
    client, address = server.accept()
  File "/home/coder/anaconda3/envs/py38/lib/python3.8/socket.py", line 292, in accept
    fd, addr = self._accept()
KeyboardInterrupt

Process finished with exit code 130 (interrupted by signal 2: SIGINT)

tcp_client

/home/coder/anaconda3/envs/py38/bin/python /home/coder/PycharmProjects/pythonProject1/tcp_client.py
b'server accept!'

Process finished with exit code 0

学习推荐


Python具有开源、跨平台、解释型、交互式等特性,值得学习。
Python的设计哲学:优雅,明确,简单。提倡用一种方法,最好是只有一种方法来做一件事。
代码的书写要遵守规范,这样有助于沟通和理解。
每种语言都有独特的思想,初学者需要转变思维、踏实践行、坚持积累。