2017/10/12第一次修改问题
现在不清楚的地方就是:采用 127.0.0.1 的主机IP可行,而采用另一种主机IP 192.168.*.* 却不行。
防火墙12001端口是开放的。
以下为原始问题
服务器端套接字调用recvfrom(1024)处于等待接受状态,客户端套接字调用了sendto方法,已经确认了IP地址和端口号是正确的。
实际运行后发现服务器端的套接字始终读取不到任何东西(.recvfrom(1024)一直没有读取到任何东西),但是客户端的.sendto()每次都是执行完毕的。
服务器端代码:
# UDPPingerServer.py
# We will need the following module to generate randomized lost packets
import random
from socket import *
# Create a UDP socket
# Notice the use of SOCK_DGRAM for UDP packets
serverSocket = socket(AF_INET, SOCK_DGRAM)
# Assign IP address and port number to socket
serverSocket.bind(('', 12001))
while True:
# Generate random number in the range of 0 to 10
rand = random.randint(0, 10)
# Receive he client packet along with address it is coming from
print('before recv')
message, address = serverSocket.recvfrom(1024)
print('after recv')
# Capitalize the message from the client
message = message.upper()
print('after upper')
# If rand is less than 4, we consider the packet lost and do not respond if
if rand <4:
continue
# Otherwise, the server responds
serverSocket.sendto(message, address)
客户端代码:
# encoding: utf-8
from socket import *
import time
serverName &#61; &#39;192.168.0.5&#39; # 服务器地址
serverPort &#61; 12001 # 服务器制定的端口
clientSocket &#61; socket(AF_INET, SOCK_DGRAM) # 创建UDP套接字&#xff0c;使用IPv4协议
clientSocket.settimeout(1) # 设置套接字超时值1秒
for i in range(0, 10):
sendTime &#61; time.time()
message &#61; (&#39;Ping %d %s&#39; % (i&#43;1, sendTime)).encode() # 生成数据报&#xff0c;编码为bytes以便发送
try:
print(&#39;before-send&#39;)
clientSocket.sendto(message, (serverName, serverPort)) # 将信息发送到服务器
print(&#39;after-send&#39;)
modifiedMessage, serverAddress &#61; clientSocket.recvfrom(1024) # 从服务器接收信息&#xff0c;同时也能得到服务器地址
print(&#39;after-recvd&#39;)
rtt &#61; time.time() - sendTime # 计算往返时间
print(&#39;Sequence %d:Reply from %s RTT &#61; %.3f&#39; % (i&#43;1, serverName, rtt)) # 显示信息
except Exception as e:
print(&#39;Sequence %d Request timed out&#39; % (i&#43;1))
clientSocket.close() # 关闭套接字
客户端程序代码中的IP地址是我本机固定的内网IP地址&#xff0c;是确信的。(另外我也用windows命令行的Ping功能Ping通了本机IP)
12001端口号没有被其他程序占用是确信的..(不然也无法运行&#xff0c;因为会提示10048错误)
如果问题描述有不清楚的地方请告知&#xff0c;谢谢。