python - 如何使用 Python 将数据从客户端套接字发送到服务器套接字?
问题描述
主机运行python3.8.0
第二台机器python 3.7.5
我在我的主机上创建了一个服务器套接字:
import socket
HOST = ''
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
我还在第二台机器上创建了一个客户端套接字:
import socket
HOST = '' # The server's hostname or IP address
PORT = 65432 # The port used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
我的理解是,如果我运行server
套接字然后通过运行client
套接字进行连接,我的服务器套接字应该打印:
"connected by [client ip], [specified port]"
同时客户端应该打印:"Received b'Hello, world'
。
发生的是我的服务器打印"connected by [server ip], [random port]"
和客户端打印"Received b'Hello, world'"
。
我的问题是:
为什么服务器打印的是服务器 ip 而不是客户端 ip?如果我指定了端口,为什么端口是随机的?
如果我的服务器套接字正在运行,我如何将数据从连接的客户端套接字发送到服务器套接字?
例如:x = 'random string'
。在客户端套接字连接后,我如何发送'x'
以便在服务器端接收它?
解决方案
电脑总是使用随机端口连接,这是正常的。关于为什么打印服务器IP,你错了,没有理由打印服务器IP,服务器IP是127.0.0.1。我认为您已经在同一台机器上运行了服务器和客户端。
让我告诉你你做了什么:
- SERVER <-----创建连接-----> CLIENT
服务器 ---------------------------------- 客户
|\________________
|有联系!|
- 服务器 <----------你好世界----------客户
- 服务器-----------你好世界------------>客户端
服务器 ---------------------------------- 客户
_____________________/| |Received 'Hello world'|
这就是为什么您的客户端打印“Hello world”,而不是服务器。看这个:
服务器
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024) # The server has received 'Hello world'
if not data:
break
conn.sendall(data) # The server has sent back 'Hello world'
客户:
s.connect((HOST, PORT)) # Connected
s.sendall(b'Hello, world') # Send 'Hello world'
data = s.recv(1024) # The server has received it but sent back so now the client received again
推荐阅读
- python-3.x - 合并 Python 字典并使用它们的键对其进行排序
- testing - 迷失在赛普拉斯的“内部()”中
- tfs - TFS 2019 - 测试用例被错误删除 - 我们如何重现它们
- kubernetes - Kubernetes:是否可以将消息从一个服务广播到另一个服务?
- swift - 无法推断复杂的闭包返回类型;添加显式类型以消除歧义?
- node.js - 什么是压缩 AWS Lambda 响应以避免 6MB 限制的好方法?
- c - 如何在c中为pthreads给出执行顺序?
- java - cast("decimal(32,9)") 正在将输入值 0 转换为科学值 0E-9
- java - rjava 使用中的不同错误
- internet-explorer-11 - IE11 两个音频标签只有一个工作