10 python linux network-programming python-2.7
重新启动应用程序运行侦听TCP端口的最佳方法是什么?问题是:如果我快速启动应用程序作为重新启动它失败,因为正在监听的套接字已被使用.
在这种情况下如何安全重新启动?
socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)
码:
#!/usr/bin/python
import sys,os
import pygtk, gtk, gobject
import socket, datetime, threading
import ConfigParser
import urllib2
import subprocess
def server(host, port):
sock = socket.socket()
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((host, port))
sock.listen(1)
print "Listening... "
gobject.io_add_watch(sock, gobject.IO_IN, listener)
def listener(sock, *args):
conn, addr = sock.accept()
print "Connected"
gobject.io_add_watch(conn, gobject.IO_IN, handler)
return True
def handler(conn, *args):
line = conn.recv(4096)
if not len(line):
print "Connection closed."
return False
else:
print line
if line.startswith("unittest"):
subprocess.call("/var/tmp/runme.sh", shell=True)
else:
print "not ok"
return True
server('localhost', 8080)
gobject.MainLoop().run()
Run Code Online (Sandbox Code Playgroud)
runme.sh
#!/bin/bash
ps aux | grep py.py | awk '{print $2}' | xargs kill -9;
export DISPLAY=:0.0 && lsof -i tcp:58888 | grep LISTEN | awk '{print $2}' | xargs kill -9;
export DISPLAY=:0.0 && java -cp Something.jar System.V &
export DISPLAY=:0.0 && /var/tmp/py.py &
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,我将Java和Python一起用作具有两层的一个应用程序.所以runme.sh是我的启动脚本,可以同时启动这两个应用程序.从Java我按下Python重新启动按钮.但Python没有重新启动,因为杀戮是通过BASH完成的.
SO_REUSEADDR在绑定之前,您必须找到与套接字上的设置等效的 Python 。确保套接字在退出时关闭(如其他答案中所建议的那样)既不是必要的,也不是充分的,因为(a)进程退出时操作系统会关闭套接字,并且(b)您仍然必须克服状态中已接受的连接TIME_WAIT,这仅SO_REUSEADDR可以做。