创建多线程tcp服务器python 3

创建多线程tcp服务器python 3,python,multithreading,sockets,Python,Multithreading,Sockets,您好,我尝试制作一个同时接受多个客户端的简单服务器。我是python新手,很难理解……我尝试在多线程应用程序中更改代码,但没有取得积极的结果……以下是代码: import socket, threading def message(): while 1: data = connection.recv(1024) if not data: break #connection.sendall(b'-- Message Received --\n

您好,我尝试制作一个同时接受多个客户端的简单服务器。我是python新手,很难理解……我尝试在多线程应用程序中更改代码,但没有取得积极的结果……以下是代码:

import socket, threading
def message():
    while 1:
        data = connection.recv(1024)
        if not data: break
        #connection.sendall(b'-- Message Received --\n')
        print(data.decode('utf-8'))
    connection.close()

def connection():
    address = input("Insert server ip")
    port = 44444
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((address, port))
    s.listen(1) 
    print("Server started! Waiting for connections...")

def accept connection():
    connection, address = s.accept()
    print('Client connected with address:', address)
    t=thread.Threading(target=message,args=(connection))
    t.run()
我知道有很多错误,但我是python新手抱歉:(

原始的非线程代码是:

import socket

address = input("Insert server ip:")
port = 44444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((address, port))
s.listen(1)
print("Server started! Waiting for connections...")

connection, address = s.accept()
print('Client connected with address:', address)

while 1:
    data = connection.recv(1024)
    if not data: break

    #connection.sendall(b'-- Message Received --\n')
    print(data.decode('utf-8'))

connection.close()

下面是一些示例代码,显示了一个螺纹套接字连接

def sock_connection( sock, host ):
  "Handle socket"
  pass

while 1:
  try:
    newsock = sock.accept()
    thread = Thread( target=sock_connection, args=newsock )
    thread.start()
  except Exception, e:
    print "error on socket connection: " % e)

下面是一些示例代码,显示了一个螺纹套接字连接

def sock_connection( sock, host ):
  "Handle socket"
  pass

while 1:
  try:
    newsock = sock.accept()
    thread = Thread( target=sock_connection, args=newsock )
    thread.start()
  except Exception, e:
    print "error on socket connection: " % e)

下面是一些示例代码,显示了一个螺纹套接字连接

def sock_connection( sock, host ):
  "Handle socket"
  pass

while 1:
  try:
    newsock = sock.accept()
    thread = Thread( target=sock_connection, args=newsock )
    thread.start()
  except Exception, e:
    print "error on socket connection: " % e)

下面是一些示例代码,显示了一个螺纹套接字连接

def sock_connection( sock, host ):
  "Handle socket"
  pass

while 1:
  try:
    newsock = sock.accept()
    thread = Thread( target=sock_connection, args=newsock )
    thread.start()
  except Exception, e:
    print "error on socket connection: " % e)

你的基本设计很接近,但你有很多小问题,很难向前推进

首先,函数名中有一个空格,这是不允许的。还有一个
IndentationError
,因为没有缩进它的内容


接下来,在
accept\u connection
函数中,您使用的
threading
错误

thread.Threading
不存在;您可能是指
Threading.thread

args
必须是值的序列(元组、列表等)。您可能希望
(连接)
是一个值的元组,但事实并非如此;元组由逗号定义,而不是括号,您所拥有的只是值
连接
,周围有多余的括号。您想要
(连接,)
这里

另外,在线程对象上调用
run
只会在当前线程中运行线程的代码。您要调用,它将启动一个新线程并在该线程上调用
run
方法


同时,你从来没有在任何地方调用过这个函数,所以它当然不能做任何事情。想想你想在哪里调用它。在创建侦听器套接字之后,你想在
accept
中循环,为每个接受的连接启动一个新的客户端线程,对吗?所以,你想在
co内循环调用它连接
,或在顶层(在这种情况下,
连接
必须
返回s


最后,您的
accept\u connection
函数无法从其他函数访问局部变量;如果您希望它使用名为
s
的套接字,则必须将其作为参数传递

因此:


作为旁注,请小心使用
sock.recv(1024)
,并假设您将获得另一方使用
send(msg)发送的整个消息
。您可能会得到它,或者您可能会得到一半的消息,或者整个消息加上客户端稍后发送的另一条消息的一半。套接字只是字节流,就像文件一样,而不是单独的消息流;您需要某种协议来分离消息


最简单的协议是在自己的线路上发送每条消息和
对于f:
中的行,就像对真实文件一样。当然,如果您的邮件可以有换行符,这是不起作用的,但是您可以,例如,在一侧反斜杠转义,在另一侧取消转义。

您的基本设计很接近,但是您遇到了很多小问题,很难继续前进

首先,函数名中有一个空格,这是不允许的。还有一个
IndentationError
,因为没有缩进它的内容


接下来,在
accept\u connection
函数中,您使用的
threading
错误

thread.Threading
不存在;您可能是指
Threading.thread

args
必须是值的序列(元组、列表等)。您可能希望
(连接)
是一个值的元组,但事实并非如此;元组由逗号定义,而不是括号,您所拥有的只是值
连接
,周围有多余的括号。您想要
(连接,)
这里

另外,在线程对象上调用
run
只会在当前线程中运行线程的代码。您要调用,它将启动一个新线程并在该线程上调用
run
方法


同时,你从来没有在任何地方调用过这个函数,所以它当然不能做任何事情。想想你想在哪里调用它。在创建侦听器套接字之后,你想在
accept
中循环,为每个接受的连接启动一个新的客户端线程,对吗?所以,你想在
co内循环调用它连接
,或在顶层(在这种情况下,
连接
必须
返回s


最后,您的
accept\u connection
函数无法从其他函数访问局部变量;如果您希望它使用名为
s
的套接字,则必须将其作为参数传递

因此:


作为旁注,请小心使用
sock.recv(1024)
,并假设您将获得另一方使用
send(msg)发送的整个消息
。您可能会得到它,或者您可能会得到一半的消息,或者整个消息加上客户端稍后发送的另一条消息的一半。套接字只是字节流,就像文件一样,而不是单独的消息流;您需要某种协议来分离消息


最简单的协议是在自己的线路上发送每条消息和
对于f:
中的行,就像对真实文件一样。当然,如果您的邮件可以有换行符,这是不起作用的,但是您可以,例如,在一侧反斜杠转义,在另一侧取消转义。

您的基本设计很接近,但是您遇到了很多小问题,很难继续前进

首先,函数名中有一个空格,这还不是全部