Программа Python Socket (TCP) не заканчивается - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу иметь несколько соединений на серверной части моей программы. Я хочу закрыть свою программу, когда все клиенты закрыты, когда я отправляю команду «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 секунды, но это не так.

Извините, что моя программа на турецком языке. Я пытался писать как можно более открыто.

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 06 ноября 2018

Я решил все проблемы с последней ревизией. Это работает очень хорошо. Я рад, что решил это самостоятельно, даже если никто не помог мне. Когда мы работаем как клиент, только если данные не существуют в базе данных, они также легко добавляются после этого.

Программа:

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

Удачи с ...

...