Python - 如何在应用程序具有侦听模式的TCP端口时如何重新启动应用程序?

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完成的.

use*_*421 3

SO_REUSEADDR在绑定之前,您必须找到与套接字上的设置等效的 Python 。确保套接字在退出时关闭(如其他答案中所建议的那样)既不是必要的,也不是充分的,因为(a)进程退出时操作系统会关闭套接字,并且(b)您仍然必须克服状态中已接受的连接TIME_WAIT,这仅SO_REUSEADDR可以做。