相关文章推荐
谦和的数据线  ·  MUJI无印良品·  1 周前    · 
爱听歌的领带  ·  javascript acm ...·  5 月前    · 

在python中实现tcp/ip通信可以利用内置的socket模块,它提供了标准的BSD Sockets API。socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCP或UDP端口号”就为socket。

为了建立通信我们要实现服务器端(Server)和客户端(Client)程序,由于在我的同一台电脑上运行,故两个程序的ip地址设置相同。代码如下:

Server端代码:

# coding:utf-8
# server端程序
import socket #导入socket 模块
address = ('192.168.0.7', 50000) #IP地址和端口号
print('Waiting for a client now !')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #创建一个空的套接字,socket.AF_INET表示创建一个IP套接字;
                                                            #socket.SOCK_STREAM表示流式socket,TCP模式;sock_DGRAM表示数据报式socket,UDP模式
server.bind(address)    #绑定(监听这个IP地址和端口的所有数据)到这个套接字上
server.listen(5)        #表示最多可以和5个客户端连接,超过5个就会拒绝
# 调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。
# accept方法返回一个含有两个元素的元组(connection,address)。
# 第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址
client, addr = server.accept()
data = client.recv(1000)         #指定最大可以接受消息长度为1000字节
print("Client:", client, "Said", data)  #输出client客户端信息以及接收到的数据data
client.sendall(b'hello')         #发送数据
client.close()                   #关闭
server.close()

Client端代码:

# coding:utf-8
# client端程序
import socket
address = ('192.168.0.7', 50000)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(address) #与指定地址建立连接
print("Connection  succeeded!")
client.sendall(b'Hi!') #发送数据,注意要加b''
data = client.recv(1000)
print("Server reply", data)
client.close()

但是我在运行Client端程序时,有时会遇到如下的报错:

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

这说明服务器已经找到,但连接被服务器拒绝。于是我查了一下,连接失败原因可能有三点:

1.数据包被服务器端的防火墙过滤掉;

2.端口号设置错误;

3.服务器没有处于监听状态,被占用不等于在被监听。

通过检查发现端口号是一致的,排除原因一;通过检查防火墙设置和利用cmd指令:ping 192.168.0.7,能正常收到如下回复,排除原因二;

并且我发现当server端程序运行时,程序就能正常运行,运行结果如下:

于是确定是原因三,由于端口未被监听,造成client.connect()函数连接失败返回异常,最终程序异常退出。

可以利用python中的try/except语句来处理异常做出改进,当程序运行try下面的client.connect()语句遇到异常后,会进入except异常处理块中执行输出”Connection failed.”,改进后的代码如下:

# coding:utf-8
# client端程序
import socket   # 导入 socket 模块
    address = ('192.168.0.7', 50000)
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(address) #与指定地址建立连接
    print("Connection  succeeded!")
    client.sendall(b'Hi!') #发送数据,注意要加b''
    data = client.recv(1000)
    print("Server reply", data)
    client.close()
except:
    print("Connection failed.")

这样,问题就解决了。当遇到server端未启动监听时,程序也不会异常退出,运行结果如下:

在python中实现tcp/ip通信可以利用内置的socket模块,它提供了标准的BSD Sockets API。socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCP或UDP端口号”就为socket。  ...
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝无法连接。 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的
问题描述: 1.当你卸载python库的时候,如:pip uninstall pandas 2.当你想要更新python库的时候,如:pip install –upgrade pandas 等等… 就会出现PermissionError: [WinError 5] 问题 废话不多说,分三步完全解决该问题: 关闭跟python相关的所有程序,如jupyter,pycharm,Anaconda等等,这一步非常重要!!! 好了,第一步完成下面开始常规操作的两步: 赋予用户对python的“完全控制”的权限,步骤如下: 找到按照python的位置,本文用的是Anaconda,安装在
NotADirectoryError: [WinError 267] 目录名称无效。: ‘C:\Program Files\SeleniumDrivers\geckodriver.exe’ 今天在测试火狐浏览器Firefox Selenium WebDriver的时候遇到NotADirectoryError: [WinError 267] 这个错误,代码如下: # -*- coding:utf-8 -*- 测试firefox webdriver 文件:WebDriverDemo.py 作者:zhangxl 日期:2020年05月05日 from selenium import
使用socket进行网络编程的时候,客户端使用connect函数去连接服务器的时候,有时候会出现Connection refused的错误。 这种错误的两个原因(目前我所碰到的)是: 1.服务器没有启动相应的端口进行监听。 2.服务器存在防火墙,阻止了当前访问。 现对第二种情况进行解决: 1.在系统安装了类似于firewall等软件的情况下,根据对应的软件命令或者规则来进行调整
今天遇到一个这样的问题,在进行SOCKET连接时,地址和端口都正确,对侧服务器端也处于监听状态,但仍会报错,错误是: Connection refused 后来发现,问题原因是字节序错误,源代码中是这样写的: #ifdef _LITTLE_ENDIAN  server.sin_port=xshort(portNumber); #else  server.sin_port=portNum
在tty1上运行服务器程序,在tty2上运行客户端程序 若连接成功,则服务器程序会向客户端程序发送“Hello World!”字符串。 服务端正常监听,但是客户端在连接时却连接不上,connect()函数返回-1。 服务端部分代码 int main(int argc, ch...
pymysql.err.operationalerror: (2003, "can't connect to mysql server on '127.0.0.1' ([winerror 10061] 由于目标计算机积极拒绝无法连接。)")