请教python socket通信问题

jeky_zhang2013 2013-08-31 10:24:18
最近学习scoket通信,一个客户端,一个服务器,服务器开启一个socket通信一直监听,客户端给服务器发消息。消息的接受都是正常的。中断服务器后(杀掉python.exe进程,有时是键盘中断事件),服务器端关闭后,z 再启动服务器就报error ,套接字/端口异常,起不来了,有时关掉python.exe进程能够重新起来,不过有时终止后没有python进程。
在网上搜了下说是端口占用,我用netstat -ano查看了端口所在的进程号,在进程管理器中没有对应的进程ID,只能换端口,但是异常终止后还需要继续换端口,很麻烦,我在py文件末尾都加上了关闭socket.close(),请教高手有什么好的解决办法.
...全文
220 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yueguanghaidao 2013-09-05
  • 打赏
  • 举报
回复
引用 8 楼 jeky198306 的回复:
[quote=引用 7 楼 yueguanghaidao 的回复:] 应该没有重用端口吧,即使使用close关闭连接,但端口并没有释放,要经过一个TIME_WAIT过程之后才能使用,所以需要设置才能立马重用端口,不然大概要等2分钟左右才能重用。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
太感谢了~~看来还是要好好看文档。[/quote] 呵呵 socket精通需要很大功夫,一起加油
jeky_zhang2013 2013-09-05
  • 打赏
  • 举报
回复
感谢大家的回复,结贴了~~
jeky_zhang2013 2013-09-05
  • 打赏
  • 举报
回复
引用 7 楼 yueguanghaidao 的回复:
应该没有重用端口吧,即使使用close关闭连接,但端口并没有释放,要经过一个TIME_WAIT过程之后才能使用,所以需要设置才能立马重用端口,不然大概要等2分钟左右才能重用。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
太感谢了~~看来还是要好好看文档。
yueguanghaidao 2013-09-04
  • 打赏
  • 举报
回复
应该没有重用端口吧,即使使用close关闭连接,但端口并没有释放,要经过一个TIME_WAIT过程之后才能使用,所以需要设置才能立马重用端口,不然大概要等2分钟左右才能重用。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
jeky_zhang2013 2013-09-01
  • 打赏
  • 举报
回复
引用 1 楼 panghuhu250 的回复:
[quote=引用 楼主 jeky198306 的回复:] 中断服务器后(杀掉python.exe进程,有时是键盘中断事件),...,我在py文件末尾都加上了关闭socket.close(),请教高手有什么好的解决办法.
你提到的中断服务器的办法,都使得服务器进程非正常退出,所以文件末尾的socket.close()都没有机会执行。[/quote] 应该用异常处理会好一点,但是中途要中断有什么好的办法么?现在是调试。
panghuhu250 2013-09-01
  • 打赏
  • 举报
回复
引用 4 楼 snmr_com 的回复:
个人认为,程序内做捕捉异常,提示端口占用就好了 杀进程应该是额外工作(可以另写一个程序做这事),而不是在同一个程序内完成 因为端口占用很难说就是原来同一个程序产生的,也有可能是其他软件产生的,只不过在你所说的情况是相同而已,所以是否杀进程理应交给使用者判断,这才符合设计原则
非常同意。我一直想的是楼主在做调试,才需要不时重启服务器进程。
jeky_zhang2013 2013-09-01
  • 打赏
  • 举报
回复
感谢两位高手的耐心答复,学到不少~~
ImN1 2013-09-01
  • 打赏
  • 举报
回复
个人认为,程序内做捕捉异常,提示端口占用就好了 杀进程应该是额外工作(可以另写一个程序做这事),而不是在同一个程序内完成 因为端口占用很难说就是原来同一个程序产生的,也有可能是其他软件产生的,只不过在你所说的情况是相同而已,所以是否杀进程理应交给使用者判断,这才符合设计原则
panghuhu250 2013-09-01
  • 打赏
  • 举报
回复
能想到的有几个办法: 1. Ctrl-C。可以捕获键盘中断事件。

if __name__=='__main__':
  try:
     main()  # 开始做事
  except KeybordInterrupt as e:
     socket.close()
2. 捕获系统的杀掉进程的信号。如果你是用liunx,可以用signal模块。windows下,进程是怎么杀掉的,我就不清楚了。 3. 用文件做信号,在程序中定期检查某个文件的存在性,如果文件存在,就中断服务退出。 4. 客户端给服务器发特殊的消息,服务器收到后退出。这个办法好处是可以远程控制,坏处是有安全隐患。
panghuhu250 2013-09-01
  • 打赏
  • 举报
回复
引用 楼主 jeky198306 的回复:
中断服务器后(杀掉python.exe进程,有时是键盘中断事件),...,我在py文件末尾都加上了关闭socket.close(),请教高手有什么好的解决办法.
你提到的中断服务器的办法,都使得服务器进程非正常退出,所以文件末尾的socket.close()都没有机会执行。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧