python检测端口是否被占用_Linux端口被占用的解决(附Python专版)

先说一般情况的解决:

lsof -i:8000 查出PID,然后 kill掉程序,接着就可以了

软件重启之后绑定没有释放,lsof -i:8080也查不出来占用的情况

再来个长连接版Python解决法:(软件重启之后绑定没有释放,lsof -i:8080也查不出来占用的情况)

端口被占的处理: tcp_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

一般情况图示:

解决后图示:

完整示例代码:

from socket import socket, SOL_SOCKET, SO_REUSEADDR

def main():

with socket() as tcp_socket:

# 防止端口占用

tcp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

# 绑定端口

tcp_socket.bind(('', 8080))

# 监听

tcp_socket.listen()

# 等待

client_socket, address = tcp_socket.accept()

# 收发消息

with client_socket:

print(f"[来自{address}的消息:\n")

msg = client_socket.recv(2048)

if msg:

print(msg.decode("utf-8"))

client_socket.send(

"""HTTP/1.1 200 ok\r\nContent-Type: text/html;charset=utf-8\r\n\r\n

哈哈哈

"""

.encode("utf-8"))

if __name__ == "__main__":

main()

服务器版解决

from socket import SOL_SOCKET, SO_REUSEADDR

from socketserver import ThreadingTCPServer, BaseRequestHandler

class MyHandler(BaseRequestHandler):

def handle(self):

print(f"[来自{self.client_address}的消息:]")

data = self.request.recv(2048)

print(data)

self.request.send(

"HTTP/1.1 200 ok\r\nContent-Type: text/html;charset=utf-8\r\n\r\n

小明,晚上吃鱼汤吗?

"

.encode("utf-8"))

def main():

# bind_and_activate=False 手动绑定和激活

with ThreadingTCPServer(('', 8080), MyHandler, False) as server:

# 防止端口占用

server.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

server.server_bind() # 自己绑定

server.server_activate() # 自己激活

server.serve_forever()

if __name__ == "__main__":

main()

解决前:

解决后:

这个就涉及到`TCP4次握手`相关的内容了,如果不是长连接,你先断开客户端,再断开服务端就不会遇到这个问题了,具体问题下次继续探讨~

有时候会这样简化写(虽然简化了,但有时候也会出现端口占用的情况)

from socket import SOL_SOCKET, SO_REUSEADDR

from socketserver import ThreadingTCPServer, BaseRequestHandler

class MyHandler(BaseRequestHandler):

def handle(self):

print(f"[来自{self.client_address}的消息:]")

data = self.request.recv(2048)

print(data)

self.request.send(

"HTTP/1.1 200 ok\r\nContent-Type: text/html;charset=utf-8\r\n\r\n

小明,晚上吃鱼汤吗?

"

.encode("utf-8"))

def main():

# 防止端口占用

ThreadingTCPServer.allow_reuse_address = True

with ThreadingTCPServer(('', 8080), MyHandler) as server:

server.serve_forever()

if __name__ == "__main__":

main()

源码比较简单,一看就懂:

def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):

BaseServer.__init__(self, server_address, RequestHandlerClass)

self.socket = socket.socket(self.address_family,

self.socket_type)

if bind_and_activate:

try:

# 看这

self.server_bind()

self.server_activate()

except:

self.server_close()

raise

def server_bind(self):

# 看这

if self.allow_reuse_address:

self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

self.socket.bind(self.server_address)

self.server_address = self.socket.getsockname()

apache无法正常启动,80端口被占用的解决方法

apache无法正常启动,80端口被占用的解决方法 网上的方法: 仔细查看提示: make_sock: could not bind to address 0.0.0.0:80 恍然大悟,计算机上安装 ...

LoadRunner 自带订票系统flights 功能空白、1080端口被占用的解决办法

LoadRunner 自带订票系统flights 功能空白.1080端口被占用的解决办法 安装LoadRunner8.1后运行Mercury Web Tours Application,点击fligh ...

tomcat端口被占用如何解决

有时候我们在eclipse中启动项目时,Tomcat服务器会报错,显示8080.8009.8005这几个端口被占用,此时你用debug启动项目时会发现不管用,console控制台什么信息也没有,此时产 ...

8080 端口被占用的解决方法 netstat -ano;taskkill (命令行)

8080 端口被占用的解决方法 netstat -ano:taskkill (命令行) (ano 和 aon 都可以) 打开命令行: (1)netstat -ano 可查看端口使用情况,记住 PID ...

Linux下端口被占用如何解决???

有时候关闭软件后,后台进程死掉,导致端口被占用.下面以JBoss端口8083被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln netstat -tln | g ...

ApacheServer-----关于443端口被占用的解决方法

最经公司项目需要经过Apache服务器转发,自己也下载了ApacheServer,但是在启动的过程中,遇到443端口被占用,网上看了一些解决方法,都不对,没有解决问题. 执行启动命令httpd -k ...

windows 80端口被占用的解决方法

参考文献: 文献1: http://wenku.baidu.com/view/af4681bcfd0a79563c1e7289.html 文献2: http://www.2cto.com/os/201 ...

【原】无脑操作:IDEA使用时,提示"8080端口被占用"的解决

1.问题描述:IDEA使用时,提示"8080端口被占用" Description:    The Tomcat connector configured to listen on ...

随机推荐

Android 保存联系人,包括部门\职位\传真\地址\照片

private void toSaveContactInfo() { ContentValues values = new ContentValues(); // 首先向RawContacts.CON ...

ulimit 命令详解

Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限制. 下面我把某linux用 ...

java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流

前言: 之前已经对FFmpeg命令进行了封装http://blog.csdn.net/eguid_1/article/details/51787646,但是当时没有考虑到扩展性,所以总体设计不是太好, ...

Excel 若某列包含某个字符则特定列显示特定字符

今天在写Excel , 有很多重复的数据, 在想 如果 可以像Java  一样 筛选就好了 这样的效果 if ("adj".equals(sheet1.A1)){ sheet1.B ...

Tomcat设置cmd窗口的title属性

说明:官网下载tomcat之后,双击bin目录下的startup.bat文件,即可运行tomcat:linux下面运行startup.sh. 但是如果测试服务器上面搭建了多个项目,则启动之后窗口一样, ...

mongodb 数据导出

后台找我导数据 以此记录 在mongodb  bin目录下执行 ./mongoexport -d xxx(db name)-c xxx(Collection name)-u xxx(username) ...

DataTable行分组,并sum求和

两种方式: 第一种,Linq void Main() { var dt=new DataTable(); dt.Columns.Add("medicID"); dt.Columns ...

第23课 可变参数模板(4)_Optional和Lazy类的实现

1. optional类的实现 (1)optional的功能 ①optional的内部存储空间可能存储了T类型的值,也可能没有.只有当optional被T初始化之后,这个option ...

伪分布式&&完全分布式&&高可用(zookeeper)的配置文件内容

[伪分布式] ①[core-site.xml] fs.defaultFS ...

linux find grep组合使用

一.常用组合 1. 查找所有".h"文件 find /PATH -name "*.h" 2. 查找所有".h"文件中的含有"hel ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值