Amro Samy
Amro Samy

Reputation: 75

Python TCP server socket

I'm trying to open server socket using python

the code that I'm using wait for connection and pause the loop until the next connection achieved when its trying to execute this line >>

connection, client_address = sock.accept()

but I don't need to pause the loop

Is there any method to make the code skip this line and continue the loop if there is no connection

code :

Server

import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
server_address = ('localhost', 10000)
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)

# Listen for incoming connections
sock.listen(5)

while True:
    # Wait for a connection
    print >>sys.stderr, 'waiting for a connection'
    connection, client_address = sock.accept()
	
    try:
        print >>sys.stderr, 'connection from', client_address

        # Receive the data in small chunks and retransmit it
        while True:
            data = connection.recv(16)
            print >>sys.stderr, 'received "%s"' % data
            if data:
                print >>sys.stderr, 'sending data back to the client'
                connection.sendall(data)
            else:
                print >>sys.stderr, 'no more data from', client_address
                break
            
    finally:
        # Clean up the connection
        connection.close()	

Client

import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the socket to the port where the server is listening
server_address = ('localhost', 10000)
print >>sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)


try:
    
    # Send data
    message = 'This is the message.  It will be repeated.'
    print >>sys.stderr, 'sending "%s"' % message
    sock.sendall(message)

    # Look for the response
    amount_received = 0
    amount_expected = len(message)
    
    while amount_received < amount_expected:
        data = sock.recv(32)
        amount_received += len(data)
        print >>sys.stderr, 'received "%s"' % data

finally:
    print >>sys.stderr, 'closing socket'
    sock.close()
	

Upvotes: 1

Views: 2881

Answers (2)

Robert Christie
Robert Christie

Reputation: 20685

You can set the socket to be non blocking, this will then return an error if there is no connection ready rather than blocking indefinetly

sock.setblocking(False)
try:
    connection, client_address = sock.accept()
except:
    print 'No Connection'

Upvotes: 0

Bart van Heukelom
Bart van Heukelom

Reputation: 44074

What you want is either:

  • Accept the socket in a different thread
  • Use an asynchronous socket API

I don't know Python very well, but I'm pretty sure it doesn't support threads for this, so async IO it is. A quick search gives me https://docs.python.org/2/library/asyncore.html

Upvotes: 1

Related Questions