我正在使用这两个程序在我的两台计算机之间进行通信,一台是我正在进行的计算机,而且我没有在任何一方返回任何内容。它只运行而不发送任何东西
客户端
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()
我可能做错了什么?
答案 0 :(得分:8)
问题在于您客户的地址:
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('cool')
time.sleep(.5)
从评论中更新
因为您使用的是wifi连接,这意味着这两台计算机都在本地网络上。您需要找到服务器的LAN IP地址,将其指定为目标。
查找IP的命令行方法
ifconfig
ipconfig /all
答案 1 :(得分:0)
如果在将SERVER_IP更改为真实服务器的地址后仍然无效,请检查服务器上的防火墙是否接受端口5000上UDP的流量。
如果您的服务器是Linux机器,iptables -L会显示防火墙规则。 iptables -F将删除所有(!)防火墙规则,因此您可以测试是否有帮助。这不是重启持久性。
答案 2 :(得分:0)
您应该看到这样的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()
答案 3 :(得分:0)
要连接到任意客户端,必须将套接字绑定到任一
socket.gethostname()
就是我正在成功使用的内容,或者使用空字符串""
关于服务器代码:我们使用socket.gethostname()
以便套接字对外界可见。如果我们使用
s.bind(('localhost', 80))
或
s.bind(('127.0.0.1', 80))
我们仍然有一个“服务器”套接字,但是只有在同一台机器中可见。 s.bind(('', 80))
指定套接字可以通过计算机碰巧拥有的任何地址访问。
答案 4 :(得分:0)
此程序用于从客户端发送“小写字母字符串”并从服务器获取“大写字母”
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()