簡體   English   中英

套接字服務器和客戶端在相同的python腳本中

[英]Sockets server and client in the same python script

當我將套接字服務器和客戶端代碼都保存在同一腳本文件中時,如果使用start_new_thread在主線程和客戶端在單獨的線程中運行服務器,則以下代碼不起作用

import socket, sys
from thread import *

host = socket.gethostname()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.bind((host, 8888))
except socket.error as msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()
s.listen(10)

def clientthread(conn):
    conn.send('Welcome to the server. Type something and hit enter\n')
    while True:
        data = conn.recv(1024)
        reply = 'OK...' + data
        if not data:
            break
        conn.sendall(reply)
    conn.close()

while 1:
    conn, addr = s.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])
    start_new_thread(clientthread ,(conn,))
s.close()

如果bind()gethostname() ,則還必須從客戶端連接到該接口,即使該接口位於同一台計算機上。 "localhost""127.0.0.1"將不起作用。 如果您希望它們起作用,則直接將它們bind()到它們,或綁定到所有內容( "0.0.0.0"或只是一個空字符串"" )。

低預算測試代碼:

from _thread import *
import socket,time

def client():
    print("Thread starts")
    time.sleep(1)
    print("Thread connects")
    sock=socket.create_connection((socket.gethostname(),8888))
    #sock=socket.create_connection(("localhost",8888))
    print("Thread after connect")
    sock.sendall(b"Hello from client")
    sock.close()
    print("Thread ends")

serv=socket.socket()
serv.bind((socket.gethostname(),8888))
#serv.bind(("localhost",8888))
#serv.bind(("0.0.0.0",8888))
#serv.bind(("",8888))
serv.listen(10)
start_new_thread(client,())
print("Before accept")
s,c=serv.accept()
print("After accept "+c[0])
print("Message: "+s.recv(1024).decode("ASCII"))
s.close()
serv.close()

隨意嘗試測試各種襪子+綁定組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM