Search code examples
python-3.xsocketstcptimeout

python socket (TCP) program does not end


I want to have multiple connections on the server part of my program. I want to close my program when all clients are shut down when I send out the "Cikis()" command and end with my communication with these clients. But it still stays in "sockt.accept()" and my program does not close.

Program:

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

When the program is opened, press "2" to open the server communication. Then I connect the clients and provide communication. Then I conclude the clients by sending the "Cikis()" command. I want her shut down in the program after 2 seconds, but it doesn't.

I'm sorry that my program is in Turkish. I tried to write as openly as possible.

Thank you for your help in advance.


Solution

  • I have solved all problems with the last revision. It works very well. I'm glad I solved it on my own, even if nobody helped me. When we run as a client only if the data does not exist in the database, it is also added easily after that.

    Program:

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

    Database:

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

    Good luck with...