python socket(TCP)程序没有结束

时间:2018-11-02 12:29:01

标签: 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秒钟后在程序中关闭,但不是。

对不起,我的程序使用土耳其语。我试图尽可能公开地写信。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我已经解决了上一版的所有问题。效果很好。我很高兴我自己解决了这个问题,即使没有人帮助我。当我们仅在数据库中不存在数据的情况下以客户端身份运行时,此后它也很容易添加。

程序:

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

祝你好运...