我最近从假期回来,我的基本python 2套接字服务器现在无法通过LAN与客户端通信。服务器在mac上,客户端是我的raspberry pi或我的Windows 7机器。我在这里简化了服务器和客户端代码以举例说明:
服务器
import socket
from thread import *
HOST = socket.gethostname()
print HOST
PORT = input ("Enter the PORT number (1 - 10,000)")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM )
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print "Socket Created"
s.bind((HOST, PORT))
print "Socket Bind Complete"
s.listen(10)
print "Socket now listening"
#Sending message to connected client
#This only takes strings (words
while True:
#Wait to accept a connection - blocking call
connection, addr = s.accept()
print "Connection Established!"
connection.send("Welcome to the server. Type something and hit enter\n")
#loop so that function does not terminate and the thread does not end
while True:
#Receiving from client
data = connection.recv(1024)
if not data:
break
connection.sendall(data)
print data
connection.close()
s.close()
客户端
import socket #for sockets
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket Created"
#Get host and port info to connect
host = raw_input("HOST >>> ")
port = 2468
s.connect((host, port))
while True:
#Send some data to the remote server
message = raw_input(">>> ")
#set the whole string
s.sendall(message)
reply = s.recv(1024)
print reply
问题
这里发生了什么?我正在获取本地IP,但脚本仍然无法通信。这可能是操作系统的问题吗?
更多信息
ping命令
一个。我能够从我的Mac终端ping PI:
PING raspberrypi (67.63.55.3): 56 data bytes
64 bytes from 67.63.55.3: icmp_seq=0 ttl=240 time=17.434 ms
64 bytes from 67.63.55.3: icmp_seq=1 ttl=240 time=18.180 ms
64 bytes from 67.63.55.3: icmp_seq=2 ttl=240 time=22.046 ms
64 bytes from 67.63.55.3: icmp_seq=3 ttl=240 time=25.124 ms
64 bytes from 67.63.55.3: icmp_seq=4 ttl=240 time=31.773 ms
湾我的PI无法找到Mac作为主机。我会看到我能做些什么来解决这个问题。
℃。我的电脑能够PING我的mac。我的Mac能够ping我的电脑
防火墙
我的Mac防火墙已关闭。我将检查[Raspberry Pi Stackexchange站点]以查看PI是否有防火墙。
我测试Windows机器后会添加更多信息
答案 0 :(得分:0)
在本地运行这两个脚本,他们设法在我的机器上连接和通信。您正面临网络问题,应该很容易调试。
错误绑定。 在服务器上,打印您获得的主机。如果服务器有多个IP,您可能会尝试绑定错误的IP。您也可以将其更改为“0.0.0.0”(仅在服务器端),看看是否有效。
<强>防火墙。强>
任何一方都可能阻止操作系统级别的tcp通信。调试是通过Windows上的Wireshark和unix上的tcpdump进行的。开始嗅探,运行代码,看看出了什么问题。您很可能会看到客户端发送SYN
数据包,但服务器将无法使用SYN|ACK
数据包进行应答。如果您看到SYN
数据包到达服务器,请尝试完全关闭服务器的防火墙,然后重试。如果没有,则禁止客户端进行传出通信(不太可能),并且您需要关闭其防火墙。
使用端口。 尝试删除SO_REUSEADDR以进行调试,看看是否有变化。
<强>例外。强> 确保不要忽略套接字中的任何异常。
答案 1 :(得分:0)
你的代码工作正常但我做了一些小修改,并在代码中的注释中解释了它们:
服务器强>
import socket
from thread import *
# 1.Gets the local ip/ip over LAN.
HOST =socket.gethostbyname(socket.gethostname())
print HOST
# 2.Use port no. above 1800 so it does not interfere with ports already in use.
PORT =input ("Enter the PORT number (1 - 10,000)")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM )
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print "Socket Created"
s.bind((HOST, PORT))
print "Socket Bind Complete"
s.listen(10)
print "Socket now listening"
while True:
connection, addr = s.accept()
print "Connection Established!"
connection.send("Welcome to the server. Type something and hit enter\n")
while True:
data = connection.recv(1024)
if not data:
break
connection.sendall(data)
print data
connection.close()
s.close()
<强>客户端:强>
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket Created"
host = raw_input("HOST >>> ")
# 3. Use the same port no. entered on server.py as the client binds to the
# same port
port = input ("Enter the PORT number (1 - 10,000)")
s.connect((host, port))
while True:
message = raw_input(">>> ")
s.sendall(message)
reply = s.recv(1024)
print reply
上面的代码对我来说效果很好,我确信它也适合你,因为我遇到了同样的麻烦。发现的错误我把它们放在代码里面的注释中看看。
干杯......!