python socket.error: [Errno 48] Address already in use

简单实例

服务端

我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port(端口)

接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。

完整代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口
s.bind((host, port))        # 绑定端口

s.listen(5)                 # 等待客户端连接
while True:
    c, addr = s.accept()     # 建立客户端连接。
    print '连接地址:', addr
    c.send('欢迎访问菜鸟教程!')
    c.close()                # 关闭连接

客户端

接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为 12345。

socket.connect(hosname, port ) 方法打开一个 TCP 连接到主机为 hostname 端口为 port 的服务商。连接后我们就可以从服务端后期数据,记住,操作完成后需要关闭连接。

完整代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:client.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口好

s.connect((host, port))
print s.recv(1024)
s.close()  

现在我们打开连个终端,第一个终端执行 server.py 文件:

$ python server.py

第二个终端执行 client.py 文件:

$ python client.py 
欢迎访问菜鸟教程!

这是我们再打开第一个终端,就会看到有以下信息输出:

连接地址: ('192.168.0.118', 62461)

当我们执行上面的简单例子时,经常遇到这个错误。

那么怎么解决呢。给出两个简单的办法

打开终端,输入sudo lsof -i:XXXX

xxxx是你刚刚用来开启服务的端口号

然后执行kill AAAA

aaaa是出现的那个PID


第二个办法,打开终端,输入ps,回车

找到含有“python”关键词的PID,kill

### 解决服务器套接字绑定失败 (Address Already In Use Error 98) 当遇到 `bind` 函数返回错误码 98 (`EADDRINUSE`) 表明地址已经在使用时,通常是因为端口被其他进程占用。为了处理这个问题,可以采取以下几种方法: #### 方法一:查找并终止占用端口的进程 可以通过命令行工具来识别哪个进程正在使用目标端口,并将其终止。 对于 Linux/Unix 系统: ```bash lsof -i :<port_number> kill -9 <PID> ``` 上述命令会列出所有监听指定端口的服务及其对应的 PID(进程 ID),之后通过 kill 命令结束该服务[^2]。 #### 方法二:设置 SO_REUSEADDR 选项 另一种常见做法是在创建 socket 后立即调用 setsockopt() 来启用 SO_REUSEADDR 选项,这允许本地地址和端口号即使在 TIME_WAIT 状态下也能被重用。 Python 示例代码如下所示: ```python import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置SO_REUSEADDR标志位 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.bind(('localhost', 80)) except Exception as e: print(f'Bind failed. Error: {e}') finally: sock.close() ``` 这种方法不会影响现有连接的安全性和稳定性,在大多数情况下都是安全可靠的解决方案之一[^1]。 #### 方法三:等待一段时间再尝试重新启动程序 如果不想强制关闭任何应用程序,则可以选择等待几分钟后再试一次;因为 TCP 协议规定了一个短暂的时间窗口用于确保数据包传输完成——即所谓的“TIME_WAIT”状态。这段时间过后自然就会释放掉所使用的资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值