Python TCP server socket

佐手、 提交于 2021-01-28 14:58:16

问题


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()
	

回答1:


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'



回答2:


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



来源:https://stackoverflow.com/questions/29518773/python-tcp-server-socket

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!