服务器端代码
import socket
def server():
# 创建一个TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 绑定IP地址和端口
server_socket.bind((host, port))
# 监听,最大连接数为5
server_socket.listen(5)
print('服务器已启动,等待客户端连接...')
while True:
# 接受客户端连接
client_socket, addr = server_socket.accept()
print('接收到来自', addr, '的连接')
# 接收客户端发送的消息
data = client_socket.recv(1024).decode('utf-8')
print('接收到消息:', data)
# 回显消息给客户端
client_socket.send(data.encode('utf-8'))
# 关闭客户端连接
client_socket.close()
if __name__ == '__main__':
server()
客户端代码
import socket
def client():
# 创建一个TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 连接到服务器
client_socket.connect((host, port))
message = '你好,服务器!'
# 发送消息到服务器
client_socket.send(message.encode('utf-8'))
# 接收服务器回显的消息
data = client_socket.recv(1024).decode('utf-8')
print('接收到服务器回显:', data)
# 关闭客户端连接
client_socket.close()
if __name__ == '__main__':
client()
网络编程概念说明
- IP地址:在代码中,
socket.gethostname()
获取的是本地主机名,在实际网络环境中,这可以替换为服务器的真实IP地址。IP地址用于在网络中唯一标识一台主机,客户端需要知道服务器的IP地址才能建立连接。
- 端口:代码中定义了端口号
port = 9999
。端口是应用程序在主机上的标识,不同的应用程序通过不同的端口号来区分。服务器通过绑定特定的端口(这里是9999)来监听客户端的连接请求,客户端也需要连接到服务器的这个指定端口才能进行通信。
- 套接字(Socket):
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建了一个基于IPv4和TCP协议的套接字。套接字是网络通信的端点,它提供了一种抽象,让应用程序可以通过它来进行网络数据的发送和接收。
- TCP协议:使用
SOCK_STREAM
表明采用TCP协议,它是一种面向连接的、可靠的传输协议。在通信前需要先建立连接(如客户端的connect
和服务器的accept
操作),并且保证数据按顺序、无差错地传输。