• 0
sof1ane

برمجة الشبكات جزء 2

سؤال

في اطار سلسلة برمجة الشبكات

اضع بين ايديكم سكريبت سرفر بالغة بايثون

مع الشرح

ملاحظات :

-قمت باستخدام البرمجة الموجهة (كلاس ، ميتود = طريقة) لكن يمكن استخدام برمجة الاجرائية في برمجته

المهم هو فهم المبدأ .

-استعملت في السكريبت ip : 127.0.0.1هو للجهاز المحلي يعني لجهازك الخاص و هو اي بي المرافق للعنوان التالي localhost

صورة اثناء تشغيل سكريبت

29699344.jpg

لتحميل سكريبت بصيغة py

http://www.mediafire.com/?dbld17djgsgbdlo


نبدأ مع الشرح بسم الله

Python


import socket //هنا نقوم باستدعاء المكتبة
class sof1ane_serveur(object): //نقوم بتعريف كلاس جديد
def __init__(self, host='', port=8080): //هنا المشيد والبرامترات الخاصة
self._host, self._port=host, port //ارجاع قيم الهوست و بورت
self.address=(host, port)

// متغير من نوع قائمة وارجاع قيم الهوست وبورت فيه

self.sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

//ها نقوم بتحديد كل من

socket types et address (and protocol) families

self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

//ليتم غلق البورت بعد غلق السيرفر SO_REUSEADDR هنا يجب تفعيل

عدم استخدام هذا المر يؤدي الى حدوث خطأ في تشغيل السكريبت مرة اخرى تحت عنوان البورت مشغول


def demarrer(self): // تعريف ميتود جديد
self.sock.bind(self.address)

// ربط العنوان الخاص بالخادم الذي يتم تنفيذ البرنامج عليه

self.sock.listen(1)


//تجهيز الخادم لاستقبال الاتصالات منالشبكة مع تحديد عدد معين للاتصالات لاستقبالها

print "Server s'executant sur: ", self._port
self.gerer_con()

// نستدعي الطريقة تسيير الاتصال الذي سنتطرق اليها
def handle_request(self):

// تعريف الطريقة تسيير الاتصال
while True:

//حلقة غير منتهية لانتظار الاتصال

clientsock, addr=self.sock.accept()

//لحضة قبول الأتصال نستقبل عنوان الأي بي الخاص بالعميل و مع توفير منفذ محلي

اهمية كبيرة نضرا لانها ترجع لنا كائن العميل مع عنوانه accept() ملاحظة للطريقة

print "Connexion à partir de: ", addr
clientsock.sendall(str(addr)+" vous etes connecte au serveur...")

// ارسال رسالة نجاح الاتصال

while True:

msg=clientsock.recv(100)

//مع الكائن الذي انشأته الطريقة send et recv تستخدم

و 100 تمثل عدد الاحرف القصوى في كل رسالة accept()

if msg:
print ">> ", msg
clientsock.sendall(msg)

// >> ارسال رمز

الذي يبين جاهزية استقبال الرسائل للعميل

clientsock.close()
if __name__=="__main__":
try:
serveur=sof1ane_serveur()
serveur.start()
except KeyboardInterrupt:
exit()

// تنفيذ البرنامج الرئيسي مع التعامل مع الاخطاء في حال حدوثها

اي استفسار انا موجود

ان أخطــــــــــــــأت فمن نفــــــــــــسي وأن أصــــــــــبت فمـــــــن الله

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

2 إجابة على هذا السؤال .

  • 0

جزاكم الله خيراً.

من باب العلم بالشيء يا أخي "//" لا تستخدم في التعليق على كود بايثون بل نستخدم # أو """

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم..

الأخ الفاضل..

إذا أردت أن يكون عندي شخصين يريدان التواصل عن طريقة الشاشات التي يستخدمونها..

مثلاً.. كل شخص لديه شاشة تحتوي على عدة أزرار، كل زر يتصل بشخص آخر..

إذا قام مثلاً الشخص أ بالاتصال بالشخص ب، فإن الزر الموجود على شاشة أ مثلا يتغير لونه مثلاً وعند ب أيضاً يصبح الزر محاطاً بلون معين مثلاً..

إذا أردت ربط مثل هذا البرنامج عن طريق السوكت، أين أضع هذا الكود بالضبط الذي قمت بشرحه..

وأيضاً هل أبني برنامج خاص لكل شخص، أم أجمعهم كلهم في برنامج واحد؟؟

أرفقت مثال يوضح مقصدي ولكن مثالي كأنه بني لمستخدم واحد يعمل عمل الارسال والاستقبال، لحين معرفة ماهي الطريقة المثلى لبناء البرنامج..


import pygame,sys
from pygame.locals import *

"""
The below method tests if a mouse button has clicked on a specific area;
we sent the coordinate of the mouse click and the surface we are testing
which is a rectangle in this case..
If the coordinate is located within the area of this rectangle,
it will return True, otherwise, it returns False
this should be tested in the sender program]
"""
def collide(pos, rect):
if rect.collidepoint(pos):
s = True
else:
s = False
return s

pygame.init() #Initializing the pygame Library
screen = pygame.display.set_mode((600,480)) # Defining the surface

run=1
pos = (0,0)
state,state1,state2 = False, False, False
while run:
screen.fill((204,204,204))

for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
pygame.quit()
"""
The following statements test the mouse btuton event, and get the position of the mouse_click by
the pygame method that returns the coordinates..
then sending the specific area (a rectangle) and that position to the (collide) method
"""
if event.type == MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
state = collide(pos,r1)
state1 = collide(pos,r2)
state2 = collide(pos,r3)

r1 = Rect(240,170,120,35) # The 3 rectangle areas in my program
r2 = Rect(240,204,120,35)
r3 = Rect(240,238,120,35)


#Drawing the areas (surface, color, area, border_line_width)
pygame.draw.rect(screen, (140,140,140), r1, 1)
pygame.draw.rect(screen, (140,140,140), r2, 1)
pygame.draw.rect(screen, (140,140,140), r3, 1)

"""Below, asking each time if a certain area has been clicked by testing
the "state" returned value which was sent from the collide method..
if it was True, it should show a colored border; the color depends
on which areas had the click!
[this should be shown on the receiver's screen, but I'm still learning
how to connect the sender and the receiver programs through the socket!!]
"""
if state:
pygame.draw.rect(screen, (140,140,140), r1)
pygame.draw.rect(screen, (255,0,0), Rect(236,166,127,110), 4)
elif state1:
pygame.draw.rect(screen, (140,140,140), r2)
pygame.draw.rect(screen, (255,255,0), Rect(236,166,127,110), 4)
elif state2:
pygame.draw.rect(screen, (140,140,140), r3)
pygame.draw.rect(screen, (0,0,255), Rect(236,166,127,110), 4)

pygame.display.update()

تم تعديل بواسطه البندري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .