【问题标题】:Establishing a Client Server TCP connection建立客户端服务器 TCP 连接
【发布时间】:2021-11-06 13:29:51
【问题描述】:

我正在尝试使用 Python 套接字编程建立客户端服务器设置:

我有 2 台不同的机器(两台 VM)。我的服务器和客户端脚本运行。但是无论我从客户端发送什么,服务器都没有收到:

服务器代码:

import socket

def Main():
 
    host = 'x.x.x.x' #Server ip
    port = 15099

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host, port))

    print("Server Started")
    while True:
        data, addr = s.recvfrom(1024)
        data = data.decode('utf-8')
        print("Message from: " + str(addr))
        print("From connected user: " + data)
        data = data.upper()
        print("Sending: " + data)
        s.sendto(data.encode('utf-8'), addr)
    s.close()

if __name__=='__main__':
    Main()
 

客户代码:

import socket

def Main():

    host='Y.Y.Y.Y' #client ip
    port = 15100
    
    server = ('X.X.X.X', 15099)
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host,port))
    
    message = input("-> ")
    while message !='q':
        s.sendto(message.encode('utf-8'), server)
        data, addr = s.recvfrom(1024)
        data = data.decode('utf-8')
        print("Received from server: " + data)
        message = input("-> ")
    s.close()

if __name__=='__main__':
    Main()

我错过了什么吗?

还有,

当我在同一台机器上运行服务器和客户端时[将服务器作为本地主机],它工作正常。当它们是 2 台不同的机器时,它不会发送任何消息。

【问题讨论】:

  • 服务器代码 c.close() 中的错字。你的意思是 s.close()。
  • 已编辑。谢谢!
  • 两个虚拟机可以用所用的IP互相ping通吗?
  • 是的,两者都能互相ping通。脚本中也给出了相同的 IP。
  • 通常,服务器使用('',port)('0.0.0.0',port)(相同含义)来侦听服务器支持的任何接口,但您的代码(在客户端中使用和不使用不必要的绑定)与@一起使用987654326@作为服务器。

标签: python python-3.x sockets tcp network-programming


【解决方案1】:

客户端不需要绑定到套接字。对于客户端,创建套接字,然后使用服务器的主机和端口调用 socket.sendto()。

为客户试试这个:

def Main():
    server = ('localhost', 15099) # replace with server IP_addr
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while True:
        message = input("[enter q to quit] -> ")
        if message == 'q': break
        s.sendto(message.encode('utf-8'), server)
        data, _ = s.recvfrom(1024)
        data = data.decode('utf-8')
        print("Received from server: " + data)
    s.close()

对于服务器,将 bind() 调用更改为:

s.bind(('0.0.0.0', port))

如果服务器在运行客户端后没有获得任何连接,请尝试在同一台机器上运行客户端和服务器。

【讨论】:

  • 还是同样的问题。我发送的任何数据都不会显示在服务器上。我刚刚发送了“你好”。没用。
  • @SoftwareFan - 尝试绑定到服务器上的 0.0.0.0 以监听每个可用的网络接口。
  • 当我在同一台机器上运行服务器和客户端时[将服务器作为本地主机],它工作正常。当它们是 2 台不同的机器时,它不会发送任何消息。
  • @SoftwareFan - 听起来不是 python 问题,而是配置 VM 以打开远程连接的端口。取决于 VM 的类型(Windows 与 Linux)和/或 VMWare 与 VirtualBox 等。
  • 一个虚拟机是 Windows(客户端),另一个 [服务器] 是 CentOS。他们可以互相 ping 通,并且在 Windows 端也禁用了防火墙。我可以做些什么来检查服务器上的连接是否被拒绝?
猜你喜欢
  • 2013-05-07
  • 2013-06-06
  • 2021-08-12
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2019-06-06
相关资源
最近更新 更多