python-3.x - python socket(TCP)程序没有结束

标签 python-3.x sockets tcp timeout

我想在程序的服务器部分建立多个连接。当我发出“Cikis()”命令并结束与这些客户端的通信时,我想在所有客户端关闭时关闭我的程序。但它仍然停留在“sockt.accept()”,我的程序没有关闭。

程序:

import socket
import sys
import traceback
from threading import Thread

bağlanan =0
sayac =0
bağlanan_sayaç_liste = [-1]

def main():
    while True:
        print("""
        **********************************
        Haberleşme Uygulaması (TCP)
        **********************************

        Client mi oksa Server mi?:
        __________________________
        1- Client
        2- Server

        'q' ile çıkış yapınız.
        """)
        seçim=input("Seçim Yapınız: ")
        if seçim == "1":
            client()
            break
        elif seçim == "2":
            baslat_server()
            break
        elif seçim == "q":
            break
        else:
            print("Doğru Seçim Yapınız.")

    return seçim


def baslat_server():
    global bağlanan
    global sayac
    global bağlanan_sayaç_liste
    global sockt
    global socket

    ip = "192.168.100.85"
    port = 77
    sockt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sockt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    print("Server Açıldı")

    try:
        sockt.bind((ip, port))
    except:
        print("Bağlantı Hatası: " + str(sys.exc_info()))
        sys.exit()
    while True:
        sockt.listen(5)
        print("Dinleniyor")  
        bağlantı, adres = sockt.accept()
        gelen_ip, gelen_port = str(adres[0]), str(adres[1])         
        print("Bağlanan: {}:{} ".format(gelen_ip,gelen_port))   
        bağlanan += 1
        bağlanan_sayaç_liste.append(bağlanan)        
        try:
            Thread(target=takıl_client, args=(bağlantı, gelen_ip, gelen_port)).start()
        except:
            print(sockt, "Client (%s, %s) is offline" % adres)
            print("Başlatılamadı.")
            sockt.close()
            traceback.print_exc()
            continue                
    sockt.close()


def takıl_client(bağlantı, gelen_ip, gelen_port, max_buffer_size = 5120):
    global bağlanan
    global sayac
    global bağlanan_sayaç_liste
    global sockt
    global socket

    acikmi = True

    while acikmi:
        client_giris = beklenen_giris(bağlantı, max_buffer_size)

        if "Cikis()" in client_giris:
            print("Client çıkmak istiyor.")
            bağlanan -= 1
            sayac += 1   
            if bağlanan == 0 and sayac == (int(bağlanan_sayaç_liste[(len(bağlanan_sayaç_liste))-1])):
                socket.getdefaulttimeout()
                socket.setdefaulttimeout(2)    
            bağlantı.close()
            print("Bağlantı {}:{} Kapatıldı.".format(gelen_ip, gelen_port))
            acikmi = False

        else:
            print("İşlem Sonucu: {}".format(client_giris))
            gonderilen = input("Gönderilecek Yazınız: ")
            bağlantı.sendall(gonderilen.encode("utf-8"))

    return gonderilen

def beklenen_giris(bağlantı, max_buffer_size):
    client_giris = bağlantı.recv(max_buffer_size)
    client_giris_boyu = sys.getsizeof(client_giris)

    if client_giris_boyu > max_buffer_size:
        print("Giriş boyutu beklenenden büyük {}".format(client_giris_boyu))

    sifrele_giris = client_giris.decode("utf-8").rstrip()
    sonuc = islem_giris(sifrele_giris)

    return sonuc

def client():
    #hedef_adres=str(input("Bağlanılacak ip Giriniz: ")) #ip yi elle değiştirmek için bunu açın aşağıdakini kapatın
    #hedef_port=int(input("Bağlanılacak port Giriniz: ")) #portu elle değiştirmek için bunu açın aşağıdakini kapatın

    hedef_adres="192.168.100.71"
    hedef_port=77
    döndürülen=list()

    client = socket.socket()
    client.connect((hedef_adres, hedef_port))
    print ("q ile çıkabilirsiniz")
    gönderilen = input("Gönderilecek veri yazın:")
    if gönderilen != 'q':
        client.send(gönderilen.encode('utf-8'))
        cevap = client.recv(1024).decode('utf-8')
        print('Gelen Mesaj: ' + cevap)
    client.close()

    döndürülen.append(gönderilen)
    döndürülen.append(cevap)
    return döndürülen

def islem_giris(giris_metin):
    print("Clientten işlem girişi Bekleniyor")
    return "" + str(giris_metin)

if __name__ == "__main__":
    main()

打开程序后,按“2”打开服务器通信。然后我连接客户并提供通信。然后我通过发送“Cikis()”命令结束客户。我想让她在 2 秒后在程序中关闭,但它没有。

很抱歉我的节目是土耳其语的。我试着尽可能公开地写作。

提前感谢您的帮助。

最佳答案

我已经解决了上次修订的所有问题。它工作得很好。我很高兴我自己解决了它,即使没有人帮助我。当我们仅在数据库中不存在数据时作为客户端运行时,之后也很容易添加。

程序:

import socket
import sys
import traceback
from threading import Thread
import Veri_Tabanı

bağlanan =0
sayac =0
bağlanan_sayaç_liste = [-1]

def main():
    while True:
        print("""
        **********************************
        Haberleşme Uygulaması (TCP)
        **********************************

        Client mi yoksa Server mi?:
        __________________________
        1- Client
        2- Server

        'q' ile çıkış yapınız.
        """)
        seçim=input("Seçim Yapınız: ")
        if seçim == "1":
            client()
            break
        elif seçim == "2":
            baslat_server()
            break
        elif seçim == "q":
            break
        else:
            print("Doğru Seçim Yapınız.")


def baslat_server():
    global bağlanan
    global sayac
    global bağlanan_sayaç_liste
    global sockt
    global socket

    ip = ""
    port = 4444
    sockt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sockt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    print("Server Açıldı")

    try:
        sockt.bind((ip, port))
    except:
        print("Bağlantı Hatası: " + str(sys.exc_info()))
        sys.exit()
    while True:
        sockt.listen(5)
        print("Dinleniyor")
        try:
            bağlantı, adres = sockt.accept()
        except OSError:
            break
        gelen_ip, gelen_port = str(adres[0]), str(adres[1])         
        print("Bağlanan: {}:{} ".format(gelen_ip,gelen_port))   
        bağlanan += 1
        bağlanan_sayaç_liste.append(bağlanan)        
        try:
            Thread(target=takıl_client, args=(bağlantı, gelen_ip, gelen_port)).start()
        except:
            print(sockt, "Client (%s, %s) Kapalı" % adres)
            print("Başlatılamadı.")
            sockt.close()
            traceback.print_exc()
            continue                
    sockt.close()


def takıl_client(bağlantı, gelen_ip, gelen_port, max_buffer_size = 5120):
    global bağlanan
    global sayac
    global bağlanan_sayaç_liste
    global sockt
    global socket

    verisay= 0
    acikmi = True

    while acikmi:
        client_giris = beklenen_giris(bağlantı, max_buffer_size)
        veritab = []
        if "Cikis()" in client_giris:
            print("Client çıkmak istiyor.")
            bağlanan -= 1
            sayac += 1   
            bağlantı.close()
            print("Bağlantı {}:{} Kapatıldı.".format(gelen_ip, gelen_port))
            acikmi = False

            if bağlanan == 0 and sayac == (int(bağlanan_sayaç_liste[(len(bağlanan_sayaç_liste))-1])):
                sockt.shutdown(socket.SHUT_RDWR)
                sockt.close()
                print("Server Kapatıldı")

        else:
            print("İşlem Sonucu: {}".format(client_giris))
            al = client_giris
            gon = gonderilen = input("Gönderilecek Yazınız: ")
            verisay +=1
            bağlantı.sendall(gonderilen.encode("utf-8"))
            veritab = [verisay,gelen_ip,"Server",gon,al]
            Veri_Tabanı.deger_ekle(veritab[0],veritab[1],veritab[2],veritab[3],veritab[4])

def beklenen_giris(bağlantı, max_buffer_size):
    client_giris = bağlantı.recv(max_buffer_size)
    client_giris_boyu = sys.getsizeof(client_giris)

    if client_giris_boyu > max_buffer_size:
        print("Giriş boyutu beklenenden büyük {}".format(client_giris_boyu))

    sifrele_giris = client_giris.decode("utf-8").rstrip()
    sonuc = islem_giris(sifrele_giris)
    return sonuc

def client():
    hedef_adres="192.168.100.71"
    hedef_port=77

    client = socket.socket()
    client.connect((hedef_adres, hedef_port))
    print ("q ile çıkabilirsiniz")
    gönderilen = input("Gönderilecek veri yazın:")
    if gönderilen != 'q':
        client.send(gönderilen.encode('utf-8'))
        cevap = client.recv(1024).decode('utf-8')
        print('Gelen Mesaj: ' + cevap)
    client.close()

def islem_giris(giris_metin):
    print("Clientten işlem girişi Bekleniyor")
    return "" + str(giris_metin)

if __name__ == "__main__":
    main()

数据库:

import sqlite3

vertab= sqlite3.connect("Veriler.db", check_same_thread=False)
imleç=vertab.cursor()

def veri_tablosu():
    imleç.execute("CREATE TABLE IF NOT EXISTS veri_tab (Sira INT,Adres TEXT, Fonksiyon TEXT, Gonderilen TEXT, Gelen TEXT)")
    vertab.commit()

#veri_tablosu()

def deger_ekle(sıra,ip_adres,fonksiyon,gönderilen,alınan):
    imleç.execute("INSERT INTO veri_tab (Sira,Adres,Fonksiyon,Gonderilen,Gelen) VALUES(?,?,?,?,?)",(sıra,ip_adres,fonksiyon,gönderilen,alınan))
    vertab.commit()

#vertab.close()

祝你好运......

关于python-3.x - python socket(TCP)程序没有结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53118645/

相关文章:

java - 如何以正确的方式关闭 socket ?

java - 直接写入socket,获取TCP ZeroWindow

python-3.x - 如何使用python3从sqlite3数据库中的表中获取列名?

sockets - 如何在非阻塞套接字上设置发送超时?

c# - 在启动 TCP 服务器之前如何优雅地启动 C# TCP 客户端

c# - 有没有办法指定在 tcpClient 中使用的本地端口?

java - 如何解决 java.net.BindException : bind failed: EADDRINUSE (Address already in use)

python - 如何在 Pygame 中使用 Sprite Sheets 创建动画 Sprite ?

python - 如何在 PDF 中附加多个文件?

python - pandas 中 groupby 统计数据中的 NaN 值