![](/img/trans.png)
[英]communication between two computers via Python socket in a LAN failed
[英]Communication between two computers using python socket
我正在使用這兩個程序在我的兩台計算機之間進行通信,其中一台是我通過 ssh 連接的,並且我不會在任何一方返回任何內容。 它只是運行而不發送任何內容
客戶
import sys
from socket import socket, AF_INET, SOCK_DGRAM
SERVER_IP = '127.0.0.1'
PORT_NUMBER = 5000
SIZE = 1024
print ("Test client sending packets to IP {0}, via port {1}\n".format(SERVER_IP, PORT_NUMBER))
mySocket = socket( AF_INET, SOCK_DGRAM )
while True:
mySocket.sendto('cool',(SERVER_IP,PORT_NUMBER))
sys.exit()
服務器
from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM
import sys
PORT_NUMBER = 5000
SIZE = 1024
hostName = gethostbyname( '0.0.0.0' )
mySocket = socket( AF_INET, SOCK_DGRAM )
mySocket.bind( (hostName, PORT_NUMBER) )
print ("Test server listening on port {0}\n".format(PORT_NUMBER))
while True:
(data,addr) = mySocket.recvfrom(SIZE)
print data
sys.ext()
我可能做錯了什么?
問題出在您客戶的地址中:
SERVER_IP = '127.0.0.1'
您正在連接到本地計算機並發送數據,而您的服務器位於不同的 ip 上。 您需要連接到服務器 ip 或主機名。
您可以通過讓客戶端先連接來驗證這一點(如果無法連接則失敗)
...
import time
mySocket = socket( AF_INET, SOCK_DGRAM )
mySocket.connect((SERVER_IP,PORT_NUMBER))
while True:
mySocket.send(b'cool')
time.sleep(.5)
從評論更新
因為您使用的是 wifi 連接,這意味着這兩台機器都在本地網絡上。 您需要找到服務器的 LAN ip 地址,將其指定為目標。
查找 IP 的命令行方法
ifconfig
ipconfig /all
該程序用於從客戶端發送“小寫字母字符串”並從服務器獲取“大寫字母”
import socket
def Main():
host = '192.168.0.12' #Server ip
port = 4000
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)
c.close()
if __name__=='__main__':
Main()
import socket
def Main():
host='192.168.0.13' #client ip
port = 4005
server = ('192.168.0.12', 4000)
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()
您應該會看到如下所示的 LAN ip 地址:192.168.1.102,這是通常的 WiFi 路由器默認本地地址。 例如,您將使用 ipconfig 在 Windows 命令提示符中看到以下內容:
C:\Users\jackc>ipconfig
Windows IP Configuration
Wireless LAN adapter Wireless Network Connection 3:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Wireless LAN adapter Wireless Network Connection:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::ed97:91a4:9449:204b%13
IPv4 Address. . . . . . . . . . . : 192.168.8.106
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.8.1
我嘗試了以下適用於我的測試代碼。
客戶:
#!/usr/bin/env python3
import sys
from socket import socket, AF_INET, SOCK_DGRAM
SERVER_IP = '192.168.8.102'
PORT_NUMBER = 5000
SIZE = 1024
print ("Test client sending packets to IP {0}, via port {1}\n".format(SERVER_IP, PORT_NUMBER))
mySocket = socket( AF_INET, SOCK_DGRAM )
myMessage = "Hello!"
myMessage1 = ""
i = 0
while i < 10:
mySocket.sendto(myMessage.encode('utf-8'),(SERVER_IP,PORT_NUMBER))
i = i + 1
mySocket.sendto(myMessage1.encode('utf-8'),(SERVER_IP,PORT_NUMBER))
sys.exit()
服務器:
#!/usr/bin/env python3
from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM
import sys
PORT_NUMBER = 5000
SIZE = 1024
hostName = gethostbyname( '0.0.0.0' )
mySocket = socket( AF_INET, SOCK_DGRAM )
mySocket.bind( (hostName, PORT_NUMBER) )
print ("Test server listening on port {0}\n".format(PORT_NUMBER))
while True:
(data,addr) = mySocket.recvfrom(SIZE)
print data
sys.exit()
如果將 SERVER_IP 更改為真實服務器的地址后仍無法正常工作,請檢查服務器上的防火牆是否接受端口 5000 上的 UDP 流量。
如果您的服務器是 linux 機器, iptables -L 會顯示防火牆規則。 iptables -F 將刪除所有(!)防火牆規則,因此您可以測試是否有幫助。 這不是重新啟動持久性。
要連接到任意客戶端,您必須將套接字綁定到我成功使用的socket.gethostname()
或使用空字符串""
參考服務器代碼:我們使用了socket.gethostname()
以便套接字對外界可見。 如果我們使用
s.bind(('localhost', 80))
或者
s.bind(('127.0.0.1', 80))
我們仍然會有一個“服務器”套接字,但它只在同一台機器上可見。 s.bind(('', 80))
指定套接字可以通過機器碰巧擁有的任何地址訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.