【问题标题】:Clients not receiving data from Server python客户端未从服务器 python 接收数据
【发布时间】:2019-08-13 03:42:00
【问题描述】:

我是 Python 新手。我正在编写一个服务器程序和一个客户端程序。在这里,服务器扮演将数据分发给多个客户端的角色。它工作得很好。我的任务是使用 server.py 文件从服务器分发数据。每当任何客户需要它时,他只需在笔记本电脑中执行 clients.py 即可获得结果。但是在这里,服务器开始分发数据。使用的服务器的 ip 是 127.0.1.1。它没有占用网络提供的ip。如何让它使用局域网提供的ip。当来自其他计算机的客户端执行 clients.py 文件时。它显示连接被拒绝错误。请注意,我们都连接在局域网中。如何解决,让客户端收到数据。

这是示例客户端代码:

import socket
import os
from threading import Thread


import socket
import time

s = socket.socket()  
host = '127.0.1.1'  
port = 10016
print(host)


s.connect((host, port))
while True:
    print(s.recv(1024))
s.close() 

示例服务器代码:

import socket
import os
from threading import Thread
import thread
import threading
import time
import datetime

def listener(client, address):
    print ("Accepted connection from: ", address)
    with clients_lock:
        clients.add(client)
    try:    
        while True: 
            client.send(a)
            time.sleep(2)   

    finally:
        with clients_lock:
            clients.remove(client)
            client.close()

clients = set()
clients_lock = threading.Lock()

host = socket.gethostname()
port = 10016

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(3)
th = []
print ("Server is listening for connections...")
while True:
    client, address = s.accept()
    timestamp = datetime.datetime.now().strftime("%b %d %Y,%a, %I:%M:%S %p")
    a = "Hi Steven!!!" + timestamp
    th.append(Thread(target=listener, args = (client,address)).start())
s.close()

【问题讨论】:

  • 使用服务器上0.0.0.0的主机地址。
  • No.. 它仍然在客户端显示连接被拒绝错误
  • 您是否尝试过使用127.0.1.1 而不是seocket.gethostname
  • 是的..我试过 127.0.1.1
  • 客户端 py 文件仅在执行 server.py 文件的服务器计算机上工作。如何使它在局域网上的其他计算机上工作

标签: python python-3.x sockets client-server python-sockets


【解决方案1】:

终于找到答案了

在“/etc/hosts”文件内容中,我有一个 IP 地址映射,“127.0.1.1”到我的主机名。这导致名称解析得到 127.0.1.1。我评论了这一行。现在它起作用了。我局域网中的每个人都可以收到数据

服务器代码:

import socket
import os
from threading import Thread
import threading
import time
import datetime

def listener(client, address):
    print ("Accepted connection from: ", address)
    with clients_lock:
        clients.add(client)
    try:    
        while True: 
            client.send(a)
            time.sleep(2)   

    finally:
        with clients_lock:
            clients.remove(client)
            client.close()

clients = set()
clients_lock = threading.Lock()

host = socket.getfqdn()  # it gets ip of lan
port = 10016

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(3)
th = []
print ("Server is listening for connections...")
while True:
    client, address = s.accept()
    timestamp = datetime.datetime.now().strftime("%b %d %Y,%a, %I:%M:%S %p")
    a = ("Hi Steven!!!" + timestamp).encode()
    th.append(Thread(target=listener, args = (client,address)).start())
s.close()

客户代码:

import socket
import os
import time

s = socket.socket()  
host = '192.168.1.43' #my server ip 
port = 10016
print(host)
print(port)

s.connect((host, port))
while True:
    print((s.recv(1024)).decode())
s.close() 

【讨论】:

    【解决方案2】:

    给client.py配置局域网提供的ip(局域网中的ip这样:192.168.122.33)

    host = 'ip provided by LAN'
    

    【讨论】:

    • 没有。它没有连接。仍然显示连接错误。我的数据在服务器 ip 上运行。
    • 是不是你的客户端无法访问局域网上的服务器?防火墙关闭了吗?
    • 你可以在 shell 中试试这个:telnet ipinlan 10016
    • telnet:无法解析ipinlan/10016:名称或服务未知错误
    • 防火墙状态为非活动状态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多