这几天专业课《通信与网络》实验要求使用socket实现两台计算机的通信,本以为对socket编程还算熟悉的我应付这个实验应该没什么毛病,但是一动手发现还是挺多问题的,先将填坑之路记录于此。
实验器材
两台运行在同一局域网下的windows10家庭版PC
实验代码
运行在一台计算机上的服务端
# -*- coding: utf-8 -*-
# author: inpurer(月小水长)
# pc_type lenovo
# create_date: 2018/12/6
# file_name: server.py
# qq_mail 2391527690@qq.com
from socket import *
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('10.10.21.222',12000))
serverSocket.listen(1)
while True:
connectionSocket, addr = serverSocket.accept()
print("已与:",addr,"建立连接")
for i in range(100):
sendMessage = "数字" + str(i+1)
connectionSocket.send(sendMessage.encode("utf-8"))
connectionSocket.close()
具体代码解释问题可以参考我以前的一篇博文:传送门
这里想说的一个坑是serverSocket.bind(('10.10.21.222',12000))
,我以前本机通信的时候设置的服务端绑定的ip都是直接用127.0.0.1
表示本机,但是这里不行,必须要用上网ip,也就是运营商根据DHCP
协议给你动态分配的ip,每台电脑不一样,(经历一次开关机)每个时间段也不一定一样,怎么获取这个ip呢,有很多教程说是cmd下ipconfig
,但是一般查到的ip有许多个,比如你装个虚拟机啥的就会多出一个ip,还有的教程说是可以用python代码来获取ip,
def getHostIp():
name = socket.getfqdn(socket.gethostname( ))
#获取本机ip
ip = socket.gethostbyname(name)
#print(name)
#print(ip)
return ip
通过这种方式获取的ip也不行,具体什么问题我有空再仔细分析,下面说我的解决办法,看图
进入windows系统设置,点击网络和internet
先在左边选中以太网,再在右边选中已连接的网络
然后就看到ip地址了
然后我瞬间明白了,ipconfig指令加上当前已连接的网络是哪一个就能获取我们想要的ip
运行在另一台电脑上的客户端
# -*- coding: utf-8 -*-
# author: inpurer(月小水长)
# pc_type lenovo
# create_date: 2018/12/6
# file_name: client.py
# description: 月小水长,热血未凉
from socket import *
clientSocket = socket(AF_INET,SOCK_STREAM)
clientSocket.connect(("10.10.21.222",12000))
while True:
receiveMessage = clientSocket.recv(1024)
if not receiveMessage:
clientSocket.close()
break
receiveMessage = receiveMessage.decode("utf-8")
print(receiveMessage)
这个倒没啥坑,只是在两台电脑上运行起来后发现始终建立不起连接。所以这一晚我主要的工作量在下面。
巨坑之路
声明:下面的解决办法只是充分条件,我也不知道是不是充要条件,顺序最好按照我的来
首先关闭服务端电脑防火墙,由于只是在局域网防火墙,为了安全起见,只关闭域防火墙
以下的步骤整体上和上一步没有先后,主要是解决ping不ping地通并不超时的问题
然后点击防火墙高级设置,具体位置可看上图,点了之后进入到这样一个界面:
在入站规则的文件和打印机共享
找到两个ICMPV4的回显请求,分别点击这两个回显请求,
按照图示的来,该勾选的勾选
记得修改之后点击应用
生效,要对两个回显请求分别做上述操作,然后再运行代码,成功!
仅记录核心操作,诸如怎么进入防火墙设置之类的问题如不懂请自行百度,
如能ping通,但是仍然无法建立链接,除关闭域防火墙外,请尝试关闭电脑管家、360、MacFee等杀毒软件再重试。有问题欢迎留言或邮件。