• 0
الاخير زمانه

هل ممكن كتابة سيرفر بلغة و الكلاينت بلغة اخرى

سؤال

السلام عليكم

كنت محتار اين اضع هذا الموضوع - هنا ام في قسم السي شارب

لدي برنامج بسيط - عبارة عن كلاينت - يرسل رسالة (string) عبر الشيكة - من جهاز اندرويد

وقمت بتطبيق برنامج اخر بسيط - عبارة عن سيرفر - بلغة السي شارب - يقوم بقراءة و عرض الرسالة

الكلاينت انفذه على جهاز اندرويد

و السيرفر انفذه عى الحاسبة

لكن لا يحدث اي شيء عند التنفيذ

انا متأكد من ان جزء السيرفر شغال - لكن ربما هناك مشكلة في جزء الكلاينت

بصراحة لا ادري هل الفكرة صحيحة و قابلة تطبيق

هذا جزء الكلاينت الخاص بالاندرويد


public class SendCmdClient extends Activity {

private EditText computerIp;
private EditText cmd;

private Button sendButton;
private String serverIpAddress = "";
private boolean connected = false;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

computerIp = (EditText) findViewById(R.id.ipeditText);
cmd = (EditText) findViewById(R.id.cmdeditText);
sendButton = (Button) findViewById(R.id.button1);
sendButton.setOnClickListener(connectListener);
}


private OnClickListener connectListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (!connected) {
serverIpAddress = computerIp.getText().toString();
Thread cThread = new Thread(new ClientThread());
cThread.start();

}
}
};

public class ClientThread implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
Log.d("ClientActivity", "C: Connecting...");
Socket socket = new Socket(serverAddr, 8000);
connected = true;
while (connected) {
try {
Log.d("ClientActivity", "C: Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream())), true);
out.println(cmd.getText().toString());
Log.d("ClientActivity", "C: Sent.");
} catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}
}
socket.close();
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
connected = false;
}
}
}
}

وهو مؤخوذ من هنا

مع تعديلات طفيفة

وفي جزء السيرفر - فقط اقوم بعرض الرسالة المستلمة


private void Form1_Load(object sender, EventArgs e)
{

Control.CheckForIllegalCrossThreadCalls = false;
Thread thread = new Thread(new ThreadStart(Listen));
thread.IsBackground = true;
thread.Start();

}

public void Listen()
{
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener tcpListener = new TcpListener(localAddr, 8000);
tcpListener.Start();
TcpClient tcpClient = tcpListener.AcceptTcpClient();

NetworkStream ns = tcpClient.GetStream();

BinaryReader w = new BinaryReader(ns);
string result =w.ReadString();

// StreamReader sr = new StreamReader(ns);
// string result = sr.ReadLine();

MessageBox.Show(result);


tcpClient.Close();
// sr.Close();
ns.Close();
tcpListener.Stop();
}

لكن كما ذكرت - لا يحدث شيء عند التنفيذ - وايضا لا يظهر خطأ

اتمنى احد الاخوان يقدر يساعد في الموضوع

و جزاكم الله خيرا

تم تعديل بواسطه الاخير زمانه
1

شارك هذا الرد


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

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

  • 0
هل ممكن كتابة سيرفر بلغة و الكلاينت بلغة اخرى

طبعا

0

شارك هذا الرد


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

نعم يمكن الكتابة على الكلاينت بلغة والسيرفير بلغة أخرى طالماً أن الإثنين قادرين على التعامل مع نفس البروتوكول المشترك من حيث الإرسال والإستقبال

2

شارك هذا الرد


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

شكرا على الرد.

اذا معناه ان المشكلة الحقيقية في الكود الخاص بالاندرويد.

اريد ان اسأل - الكود الذي في الاعلى انا كتبته و افترضت انه يتنفذ بأستخدام wifi

لم اجد مصدرا بالضبط عن الربط باستخدام ال wifi - فأفترضت انه نفسه مع الشبكة العادية.

هل هناك من لديه معلومات حول الموضوع.

بارك الله بالجميع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
لم اجد مصدرا بالضبط عن الربط باستخدام ال wifi - فأفترضت انه نفسه مع الشبكة العادية.

هو كذلك فعلا

0

شارك هذا الرد


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

أخي البرنامج تبع الكلاينت ما عم يطلعلك خطأ لأنو الـ Exception يلي عم يطلع بالسطر :


Socket socket = new Socket(serverAddr, 8000);

عم تقوم الـ Catch بمسكه

بعد ما بحثت في المشكلة تبين بأن الـ Permission المخصصة للـ Socket التي نقوم بعمل new لها غير صالح لنا في التطبيق لذلك حتى تحل موضوع الصلاحية عليك القيام بالتالي :

قم بفتح الملف AndroidManifest.xml وقم بإضافة السطر التالي :


<uses-permission android:name="android.permission.INTERNET"></uses-permission>

كما في المثال الذي يوضخ لك ذلك بطريقة مبسطة :


<manifest xlmns:android...>
...
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

طبعا برنامج الكلاينت يلي حضرتك كنت كاتبو نفسو هلء أنا جربتو مع برنامج سيرفر مكتوب بلغة C# وعمل بشكل صحيح 100% والحمد لله :)

بالتوفيق نشالله

2

شارك هذا الرد


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

الله يجزاك خيرا اخي. فعلا لم اضف الصلاحية الذي ذكرتها بالاعلى.

بعد الاضافة - كما ذكرت - تنفذ البرنامج على ال emulator

لكن للأسف عند نقله الى جهاز الموبايل لم يعمل البرنامج

0

شارك هذا الرد


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

إذا كنت تريد التحدث مع خادم HTTP فلا تستخدم sockets (low-level api) بل إستخدم HttpClient

0

شارك هذا الرد


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

طيب ماهي الرسالة التي أظهرها لك الهاتف عندما لم يعمل البرنامج ؟؟

يعني كيف ما اشتغل ؟

0

شارك هذا الرد


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

الله يبارك فيك اخي.

تنفذ البرنامج الان و لله الحمد - كان هناك خطأ في اعدادات ال IP.

شكرا لكم اخوتي

0

شارك هذا الرد


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

اخي هذا احد مبادئ OOP بالبرمجة

Interface Segregation Principle (ISP)

و ينص على

"CLIENTS SHOULD NOT BE FORCED TO DEPEND UPON INTERFACES THAT THEY DO NOT USE."

ومعناه ان تعتمد في برمجتك على ال interfaces و ان ان الكلاينت لا يجب ان يفرض عليه ان يتبع شيء معين الا ال interface

وهذا سيفيدك في حال اردت ان توسع نطاق برنامجك ليعمل على نوع اخر من الكلاينت فلن يكون الكلاينت او السيرفر مقيدين بلغة معينة فقط القيود هي البروتوكولات "نوع و طريقة التواصل بينهم وشكل الرسائل"

بالتوفيق إن شاء الله

1

شارك هذا الرد


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

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

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



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

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

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