PDA

View Full Version : سوال: مشکل در برنامه نویسی سوکت در پایتون



mahdi011
پنج شنبه 14 فروردین 1393, 11:18 صبح
سلام دوستان !
من چند روزی هست که برنامه نویسی سوکت با پایتون رو شروع کردم (پایتون رو در حد بالا بلدم اما سوکت نویسی رو تازه شروع کردم)

یه فایل سرور و یه فایل کلاینت ساختم.
مشکلم اینه که میخوام دستورات سیستمی(Linux Consol) رو اجرا کنم ولی ارور زیر رو میده :


Got connection from ('127.0.0.1', 46466)Linux Mahdi 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/LinuxTraceback (most recent call last): File "ser.py", line 16, in <module> c.send(os.system("uname -a"))TypeError: must be string or buffer, not int


سورس سرور :

http://vrl.ir/349979
سورس کلاینت :

http://vrl.ir/772438

کلا میخوام یه سرور + کلاینت بسازم که وقتی این کلاینت وصل شد به سرور بهش نسخه ی کرنل لینوکسی که داره استفاده میکنه با دستور زیر نشون داده بشه :


os.system("uname -a")


ممنون میشم کمکم کنید :X

n.nowroozi
پنج شنبه 14 فروردین 1393, 15:15 عصر
لینک کدهات ارور میده!
با twisted کار کن حرف نداره !
توی توییستد چیزی که میخوای میشه این:
سرور:


from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import os

class Echo(Protocol):
def connectionMade(self):
kernel = os.popen('uname -r').readline()
self.transport.write(kernel)
def dataReceived(self, data):
pass


def main():
f = Factory()
f.protocol = Echo
reactor.listenTCP(8000, f)
reactor.run()

if __name__ == '__main__':
main()



کلاینت:


from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor, protocol
import sys

class EchoClient(protocol.Protocol):
def connectionMade(self):
pass

def dataReceived(self, data):
print "receive:", data


class EchoClientFactory(ClientFactory):
protocol = EchoClient

def clientConnectionFailed(self, connector, reason):
print 'connection failed:', reason.getErrorMessage()
reactor.stop()

def clientConnectionLost(self, connector, reason):
print 'connection lost:', reason.getErrorMessage()
reactor.stop()

def main():
factory = EchoClientFactory()
reactor.connectTCP('localhost', 8000, factory)
reactor.run()

if __name__ == '__main__':
main()


البته دستوری هم که واسه گرفتن کرنل استفاده کردی جواب نمیده چون خروجی رو بر نمیگردونه باید از دستوری که من نوشتم استفاده کنی.

من یه مقاله ترجمه کردم واسه آشنایی با twisted برای شروع میتونی اون رو بخونی.
http://pyhome.ir/weblog/2/

mahdi011
پنج شنبه 14 فروردین 1393, 16:43 عصر
ممنون داداش :X

یه مشکل دیگه هم هست !
من میخوام وقتی سرور + کلاینت اجرا شد یه متن بیاد و بگه یه گزینه انتخواب کنید که این کار با تابع raw_input میشه !-- توی این سوکت هر کار میکنم نمیشه و وقتی میزنم که از کلاینت بخواد توی سرور اجرا میشه :D
ممنون میشم یه نمونه واسه این هم بنویسید :X
باتشکر فراوان

n.nowroozi
پنج شنبه 14 فروردین 1393, 23:38 عصر
یه چیزی مثل این باید کارت رو راه بندازه:


سرور


from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import os

class Echo(Protocol):
def connectionMade(self):
kernel = os.popen('uname -r').readline()
self.transport.write(kernel)
def dataReceived(self, data):
print data


def main():
f = Factory()
f.protocol = Echo
reactor.listenTCP(8000, f)
reactor.run()

if __name__ == '__main__':
main()


کلاینت




from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor, protocol
import sys

class EchoClient(protocol.Protocol):
def connectionMade(self):
pass

def dataReceived(self, data):
print "receive:", data
a = raw_input('type something:')
self.transport.write(a)


class EchoClientFactory(ClientFactory):
protocol = EchoClient

def clientConnectionFailed(self, connector, reason):
print 'connection failed:', reason.getErrorMessage()
reactor.stop()

def clientConnectionLost(self, connector, reason):
print 'connection lost:', reason.getErrorMessage()
reactor.stop()

def main():
factory = EchoClientFactory()
reactor.connectTCP('localhost', 8000, factory)
reactor.run()

if __name__ == '__main__':
main()

mahdi011
شنبه 16 فروردین 1393, 20:43 عصر
داداش نوروزی ممنون ولی یه مشکل دارم !
من میخوام با دستور if ببینم مقدار input چیه و اگه مثلا 1 بود بنویسه hello ! و میخوام این دستور if توی فایل سرور باشه ...


ممنون میشم کمکم کنی :X

n.nowroozi
شنبه 16 فروردین 1393, 21:38 عصر
خب کاری نداره که این بخش رو باید اصلاح کنی توی فایل سرور:

def dataReceived(self, data):

print data


باید بشه این:

def dataReceived(self, data):
if data == '1':
print 'hello!'

mahdi011
شنبه 16 فروردین 1393, 22:07 عصر
داداش من همین کار رو کردم اما ارور داد !
ممنون میشم خودت تست کنی یا یه سورس کامل بدی :X
باتشکر فراوان

n.nowroozi
شنبه 16 فروردین 1393, 22:17 عصر
کدی که نوشتی با اروری که میده رو کامل بنویس

mahdi011
شنبه 16 فروردین 1393, 22:30 عصر
این فایل سرور :


from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import os

class Echo(Protocol):
def connectionMade(self):
kernel = os.popen('uname -a').readline()
self.transport.write(kernel)

def dataReceived(self, data, a):
if data == '1' :
print 'OHHHHHHHHHHHHHH :D'


def main():
f = Factory()
f.protocol = Echo
reactor.listenTCP(8000, f)
reactor.run()

if __name__ == '__main__':
main()


اینم فایل کلاینت :


from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor, protocol
import sys

class EchoClient(protocol.Protocol):
def connectionMade(self):
pass

def dataReceived(self, data):
print "receive:", data
a = raw_input('type something:')
self.transport.write(a)


class EchoClientFactory(ClientFactory):
protocol = EchoClient

def clientConnectionFailed(self, connector, reason):
print 'connection failed:', reason.getErrorMessage()
reactor.stop()

def clientConnectionLost(self, connector, reason):
print 'connection lost:', reason.getErrorMessage()
reactor.stop()

def main():
factory = EchoClientFactory()
reactor.connectTCP('localhost', 8000, factory)
reactor.run()

if __name__ == '__main__':
main()


اروری که توی سرور میاد :

m4hdi@M4hdi:~/Desktop$ python server.py
Unhandled Error
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 84, in callWithLogger
return callWithContext({"system": lp}, func, *args, **kw)
File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 69, in callWithContext
return context.call({ILogContext: newCtx}, func, *args, **kw)
File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
return func(*args,**kw)
--- <exception caught here> ---
File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 586, in _doReadOrWrite
why = selectable.doRead()
File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 199, in doRead
rval = self.protocol.dataReceived(data)
exceptions.TypeError: dataReceived() takes exactly 3 arguments (2 given)

اینم اروری که توی کلاینت میاد :
type something:1
connection lost: Connection was closed cleanly.

n.nowroozi
یک شنبه 17 فروردین 1393, 07:56 صبح
def dataReceived(self, data, a):
خب خودش که نوشته این تابع موقع صدا شدن دوتا متغییر بهش پاس داده میشه در حالی که شما اون a رو اضافه کردی!! اون هیچ کارایی هم نداره برای چی اضافه کردی؟
اون a رو بردار درست میشه


if data == '1' :
print 'OHHHHHHHHHHHHHH :D'


if هم تو رفتگی نداره ارور میگیره

mahdi011
یک شنبه 17 فروردین 1393, 12:31 عصر
ممنون داداش
همین کار رو کردم اما متن : OHHHHHHHHHHHHHH :D توی فایل سرور نشون میده اما باید توی کلاینت نشون بده !
ممنون میشم کمکم کنی :X

n.nowroozi
یک شنبه 17 فروردین 1393, 14:23 عصر
به جای پرینت ohhh بنویس:

self.transport.write('ohhhh')

mahdi011
یک شنبه 17 فروردین 1393, 17:54 عصر
ممنون داداش :X
واقعا کمکم کردی :X
ایشالا به هرچی که میخوای برسی :X
داداش فقط یه سوال کوچولو !
من میخوام فایل سرور رو بزارم توی سرورم و فایل کلاینت رو بدم به دوستان -- اونوقت چجوری میتونم ارتباط بین اینارو برقرار کنم ؟؟؟
باتشکر

n.nowroozi
دوشنبه 18 فروردین 1393, 08:15 صبح
آی پی سرورت رو توی کلاینت ست کنی میبینند همدیگرو

mahdi011
دوشنبه 18 فروردین 1393, 14:56 عصر
داداش ایشالا خیر ببینی :X
میشه بگی چجوری میتونم توی فایل کلاینت ایپی سرورم رو بزارم ؟
باتشکر فراوان :X
بعد میشه بگید این از چه پورتی استفاده میکنه تا توی فایروال بازش کنم ؟
باتشکر فراوان :X

n.nowroozi
دوشنبه 18 فروردین 1393, 15:32 عصر
reactor.listenTCP(8000, f)
8000


reactor.connectTCP('localhost', 8000, factory)
اینجا هم جای localhost آی پی سرورت رو بزار

mahdi011
دوشنبه 18 فروردین 1393, 21:19 عصر
داداش نمیدونم چجوری تشکر کنمممممم :X -- واقعا متشکر که کمکم کردی :X

داداش فقط یه مشکل دیگه هم هست !
من میخوام وقتی فایل سرور در سرورم اجرا میشه و فایل کلاینت رو میدم به دوستام میخوام زمانی که کلاینت خواست به سرور وصل بشه , فایل سرور چک کنه و ببینه اگه ای پی کلاینت برابر با ایپی که ما وارد کردیم بود بتونه فایل رو ببینه و اگه نبود فایل براش اجرا نشه و کانکشن بسته بشه...
میشه کمکم کنی ؟
:X

n.nowroozi
دوشنبه 18 فروردین 1393, 21:28 عصر
داداش نمیدونم چجوری تشکر کنمممممم :X -- واقعا متشکر که کمکم کردی :X

داداش فقط یه مشکل دیگه هم هست !
من میخوام وقتی فایل سرور در سرورم اجرا میشه و فایل کلاینت رو میدم به دوستام میخوام زمانی که کلاینت خواست به سرور وصل بشه , فایل سرور چک کنه و ببینه اگه ای پی کلاینت برابر با ایپی که ما وارد کردیم بود بتونه فایل رو ببینه و اگه نبود فایل براش اجرا نشه و کانکشن بسته بشه...
میشه کمکم کنی ؟
:X
شما اون داکیومنتی که دادم رو بخون همه اینها توش هست

mahdi011
دوشنبه 18 فروردین 1393, 21:37 عصر
داداش همون اول اونو خوندم...
اما چیزی متوجه نشدم و اینایی که میخوام نبود ...
داداش میشه کمکم کنی ؟
اخه اخرین و تنها مشکلم همینه :D
فدایی داری :X

mahdi011
دوشنبه 18 فروردین 1393, 21:39 عصر
داداش توی این لینکی که دادی :
متد getHost :با این میشه ایپی کلاینت وصل شده رو گرفت ؟؟
من مشکلم اینه که نمیدونم کجا میشه ازش استفاده کرد ...
ممنون میشم یه نمونه یا یه کمکمی بهم بکنی :X
فدایی داری

mahdi011
دوشنبه 18 فروردین 1393, 22:07 عصر
داداش واقعا ممنون میشم همین بار هم کمکم کنی :X
اخه تنها مشکلم همینه ...
داداش فدایی داری شدید :X

n.nowroozi
دوشنبه 18 فروردین 1393, 22:51 عصر
توی سرور این متد رو تغییر بده به پایینی:

def connectionMade(self):
kernel = os.popen('uname -r').readline()
self.transport.write(kernel)



def connectionMade(self):
print "connection from", self.transport.getPeer()
kernel = os.popen('uname -r').readline()
self.transport.write(kernel)
اینجا به محض برقراری ارتباط میتونی IP رو بگیری