首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

请问python socket通信有关问题

2013-09-07 
请教python socket通信问题最近学习scoket通信,一个客户端,一个服务器,服务器开启一个socket通信一直监听,

请教python socket通信问题
    最近学习scoket通信,一个客户端,一个服务器,服务器开启一个socket通信一直监听,客户端给服务器发消息。消息的接受都是正常的。中断服务器后(杀掉python.exe进程,有时是键盘中断事件),服务器端关闭后,z 再启动服务器就报error ,套接字/端口异常,起不来了,有时关掉python.exe进程能够重新起来,不过有时终止后没有python进程。
    在网上搜了下说是端口占用,我用netstat -ano查看了端口所在的进程号,在进程管理器中没有对应的进程ID,只能换端口,但是异常终止后还需要继续换端口,很麻烦,我在py文件末尾都加上了关闭socket.close(),请教高手有什么好的解决办法.
[解决办法]

引用:
中断服务器后(杀掉python.exe进程,有时是键盘中断事件),...,我在py文件末尾都加上了关闭socket.close(),请教高手有什么好的解决办法.

你提到的中断服务器的办法,都使得服务器进程非正常退出,所以文件末尾的socket.close()都没有机会执行。
[解决办法]
能想到的有几个办法:
1. Ctrl-C。可以捕获键盘中断事件。

if __name__=='__main__':
  try:
     main()  # 开始做事
  except KeybordInterrupt as e:
     socket.close()

2. 捕获系统的杀掉进程的信号。如果你是用liunx,可以用signal模块。windows下,进程是怎么杀掉的,我就不清楚了。
3. 用文件做信号,在程序中定期检查某个文件的存在性,如果文件存在,就中断服务退出。
4. 客户端给服务器发特殊的消息,服务器收到后退出。这个办法好处是可以远程控制,坏处是有安全隐患。
[解决办法]
个人认为,程序内做捕捉异常,提示端口占用就好了
杀进程应该是额外工作(可以另写一个程序做这事),而不是在同一个程序内完成
因为端口占用很难说就是原来同一个程序产生的,也有可能是其他软件产生的,只不过在你所说的情况是相同而已,所以是否杀进程理应交给使用者判断,这才符合设计原则
[解决办法]
应该没有重用端口吧,即使使用close关闭连接,但端口并没有释放,要经过一个TIME_WAIT过程之后才能使用,所以需要设置才能立马重用端口,不然大概要等2分钟左右才能重用。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

热点排行