Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python SocketServer works on localhost but not on server

Tags:

python

sockets

Included below is the code that I am currently using:

#! /usr/bin/python
print 'Content-type: application'
print '\n\n'

import SocketServer
import cgitb
cgitb.enable()

class MyTCPHandler(SocketServer.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        print self.data
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())
        self.request.sendall('Data Received')

if __name__ == "__main__":
    HOST, PORT = "localhost", 9989

    # Create the server, binding to localhost on port 9989
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

The code works as expected on localhost, but is unresponsive on public server.

In addition, executing the code twice results in the following error message:

error: (98, 'Address already in use')

like image 750
Gal Steinberg Avatar asked Jan 16 '23 05:01

Gal Steinberg


2 Answers

error: (98, 'Address already in use')

You need this for that:

socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

but is unresponsive on public server.

Usually in case of shared hosting, you cant get through with creating a socket. In any case you could try the following, to see if it helps:

HOST, PORT = "", 9989 # or (public_IP,9989)
like image 158
UltraInstinct Avatar answered Jan 19 '23 00:01

UltraInstinct


I think the problem is that you are binding to "localhost", i.e., on the loopback interface. Try replacing "localhost" with the public IP address you want to bind to. Type ifconfig at the command line if you're not sure what that is; pick the address that's not in any one of the IP blocks designated for private use (i.e., doesn't start with 10. or 192.168. etc).

I'm not sure if it will work with TCPServer specifically but often software that requires you to bind to a specific interface will accept "0.0.0.0" for all interfaces, or an empty string to the same effect.

like image 21
Andrew Gorcester Avatar answered Jan 18 '23 23:01

Andrew Gorcester