الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

client & server in 1 computer

بدأه محــمد في 19 مارس 2010 · 18 رد · 1,895 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مساء الخير

في برنامج اخذت الأكود من كتاب.. عباره عن قسم server وقسم client

ال server يستقبل ال string من اي client يتم انشائه , ويرسل لكل ال clients المتصله معه بما فيهم ال client الي رسل

طبعاً البرنامج ما فيه إلا client واحد .. عشان كذا لما ارسل اي شيء منه .. المفروض اني استقبل الي رسلته

انا الآن ابي اجرب البرنامج .. حاولت اشغله ما اشتغل

في ملاحظه مكتوبه في الكتاب بس مافهمتها .. هذي الملاحظه :

to run chat client, you need two terminals

first, launch this server from one terminal,

then launch the client from another terminal

ماذا يقصد بـ terminal هنا ؟

هل البرامج التي تبنا على server & client لتشغيلها لازم نحتاج جهازين على الأقل او شبكه فعليه ؟

مع العلم ان الكتاب حاط ملاحظه على ال setUpNetworking method تقول:

sock = new Socket("127.0.0.1", 5000);

we're using localhost so you can test the client and server on one machine

هذه الملاحظه تقول انه يمكنني تشغيل البرنامج على جهاز واحد

إذاً اين هي المشكله هنا ؟ ام ان هناك خطأ في الكود لم انتبه له ؟

الصوره توضح لما سيبدو عليه البرنامج إذا اشتغل

ht797650.png

اترككم مع الكود..

---------------------------

server

import java.io.*;
import java.net.*;
import java.util.*;

public class VerySimpleChatServer {

    ArrayList clientOutputStreams;

    public class ClientHandler implements Runnable {
        BufferedReader reader;
        Socket sock;

        public ClientHandler(Socket clientSocket) {
            try {
                sock = clientSocket;
                InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(isReader);

            } catch(Exception ex) {ex.printStackTrace(); }
        } // close constructor

        public void run() {
            String message;
            try {
                while((message = reader.readLine()) != null) {
                    System.out.println("read " + message);
                    tellEveryone(message);

                } // close while
            } catch(Exception ex) {ex.printStackTrace(); }
            } // c run
        } // c inner class
    public static void main(String[] args) {
        new VerySimpleChatServer().go();
    }

        public void go() {
            clientOutputStreams = new ArrayList();
            try {
                ServerSocket serverSocket = new ServerSocket(5000);

                while(true) {
                    Socket clientSocket = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
                    clientOutputStreams.add(writer);

                    Thread t = new Thread(new ClientHandler(clientSocket));
                    t.start();
                    System.out.println("got a connection");
                }
            } catch(Exception ex) { ex.printStackTrace(); }
        } // c go

        public void tellEveryone(String message) {

            Iterator it = clientOutputStreams.iterator();
            while(it.hasNext()) {
                try {
                    PrintWriter writer = (PrintWriter) it.next();
                    writer.println(message);
                    writer.flush();
                } catch(Exception ex) { ex.printStackTrace(); }
            } // end while
        } // end tellEveryone
    } // end class



------------------------

client





import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleChatClient {

    JTextArea incoming;
    JTextField outgoing;
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;

    public static void main(String[] args) {
        SimpleChatClient client = new SimpleChatClient();
        client.go();
    }
    public void go() {

        JFrame frame = new JFrame("Ludicrously Simle Chat Client");
        JPanel mainPanel = new JPanel();
        incoming = new JTextArea(15,50);
        incoming.setLineWrap(true);
        incoming.setWrapStyleWord(true);
        incoming.setEditable(false);
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        outgoing = new JTextField(20);
        JButton sendButton = new JButton("send");
        sendButton.addActionListener(new sendButtonListener());
        mainPanel.add(qScroller);
        mainPanel.add(outgoing);
        mainPanel.add(sendButton);
        setUpNetworking();

        Thread readerThread = new Thread(new IncomingReader());
        readerThread.start();

        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        frame.setSize(400, 500);
        frame.setVisible(true);
} // close go

    private void setUpNetworking() {

        try {
            sock = new Socket("127.0.0.1", 5000);
            InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
            reader = new BufferedReader(streamReader);
            writer = new PrintWriter(sock.getOutputStream());
            System.out.println("netwotking established");
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    } // close setup networking

    public class sendButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            try {
                writer.println(outgoing.getText());
                writer.flush();

            } catch(Exception ex) { ex.printStackTrace(); }

            outgoing.setText("");
            outgoing.requestFocus();
        }
    } // close inner class

    public class IncomingReader implements Runnable {

        public void ran() {
            String message;
            try {
                while((message = reader.readLine()) != null) {
                    System.out.println("read" + message);
                    incoming.append(message + "\n");
                }
            } catch(Exception ex) {ex.printStackTrace(); }
        }
    }
       }

l

نداء ما كان بعيداً

#2

terminal يعني ال dos في windows وال shell في linux. يعني إفتح نافذتين لل dos أو shell، في النافذة الأولى شغل ال server، ثم في النافذة الثانية شغل ال client.

تأكد من تشغيل ال server أولا، ثم ال client.

#3

يعطيك العافيه يا بطل

مع اني ما مره جربت اشغل برنامج على الدوس

بس بقولك شسويت .. صححني إذا في غلط

شغلت الدوس .. رحت لين مكان الملف في src الكلاس بإسم VerySimpleChatServer.java

كتبت في الدوس:

javac VerySimpleChatServer.java

بعدين انشأ ملف .class

بعدين كتبت java VerySimpleChatServer

ما اشتغل .. وهذي الصوره توضح ايش كتب لي

6y6y-5ecd1ceab3.jpg

طيب ما اقدر اشغله عن طريق netbeans ?

لأني جربته ولا اشتغل ..

او يمكن في الكود خطأ ؟

نداء ما كان بعيداً

#4

كما قال الاخ herch نعم تستطيع تشغيله على نفس الجهاز ،، ممكن باستخدام ال Jcreator لكن لم اجرب باستخدام النت بينز

ولكن يجب فتح برنامج ال JCreator مرتين نافذة تشغل ملف ال server وهو الذي يجب تشغيله اولا !

ونافذة أخرى بعدما تقوم بتشغيل ملف ال server تقوم من خلالها بتشغيل ملف ال client

Linux for human beings

#5

جرب استعمال port آخر

#6

يا أخي, ربما تظهر لك الرساله دي عشان إنت مشغل البرنامج جوه نتبينز و عاوز تشغله تاني من سطر الأوامر,

تأكد أولا من إغلاق نتبينز قبل تشغير سطر الأوامر.

#7

هنالك بعض ارقام المنافذ قد تكون محجوزة لنظام التشغيل او برامج اخرى

حاول استخدام ارقام اخرى من اربع خانات مثل "5656"

#8

كما قال الاخ هويدي اعتقد ان المشكلة هي انك حاولت تشغل ال Server اكثر من مرة من غير ما تتأكد ان الserver تم اغلاقة بالفعل في المرة السابقة.

يعني لازم تضيف للكود

serverSocket.close()

عند اغلاق البرنامج لتتأكد انه تم تحرير الموارد ( المنفذ) قبل ما تحاول تشغيلة مرة اخرى سواء من netbeans او dos لافرق.

تم تعديل هذه المشاركة بواسطة Dr.Robert في 19 مارس 2010 في 23:52

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#9
اقتباس
يعني لازم تضيف للكود

serverSocket.close()

كلام سليم

اقتباس
عند اغلاق البرنامج لتتأكد انه تم تحرير الموارد ( المنفذ) قبل ما تحاول تشغيلة مرة اخرى سواء من netbeans او dos لافرق.

حسب علمي ان ال JVM هي تغلقه بنفسها حتى و ان لم تعمل له close

و ذلك حسب خبرتي

لكن من الافضل اغلاقها بنفسك

والله اعلم

#10

فعلاً يا محمد الجافا تقوم بإغلاق المنفذ بعد الإنتهاء من البرنامج في حال أنك لم تغلقه

لكن المشكلة أن البرنامج يعمل في while بمعنى أنه سيظل يعمل إلى أن تغلق شاشة dos الخاصة به أو تقوم بإيقاف الـ process

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

يعطيكم العافيه شباب..

جربت غيرت البورت ما نفع

وبالنسبه ل serverSocket.close()

ما ادري وين احطها .. جربت عدة اماكن في الكود .. دائماً تعطيني خطأ

لما قمت بإغلاغ النت بينز .. كما نصحتوني..

اشتغل ال verysimplechatserver

لكن لما افتح صفحه ثانيه واشغل ال simplechatserver

يعطيني هذا الخطأ.. كما هو في الصوره

mobdi3ine-6668c8c795.jpg

نداء ما كان بعيداً

#12

هذا الخطأ يعني أن البرنامج يحتوي على خطأ في SYNTAX ERROR

في الفئة iNCOMINGREADER

والخطأ يتلخص في كونك تقوم ببناء الواجهة Runnable

ولا تقوم بكتابة الدالة run

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#13

كلام جميل يا علاء

تم تعديل هذه المشاركة بواسطة Mohammed Mshari Ersan في 22 مارس 2010 في 15:54

#14

صحيح يا علاء وقد لاحضت من الكود في اول الموضوع ان اسم الدالة مكتوبة ran وليست run كما هو مفروض.

بالنسبة للدالة close ممكن تحطها في finally

 public void go() {
            clientOutputStreams = new ArrayList();
            try {
                ServerSocket serverSocket = new ServerSocket(5000);

                while(true) {
                    Socket clientSocket = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
                    clientOutputStreams.add(writer);

                    Thread t = new Thread(new ClientHandler(clientSocket));
                    t.start();
                    System.out.println("got a connection");
                }
            } catch(Exception ex) { ex.printStackTrace(); }
finally{
try{
serverSocket.close()
}catch(Exception e){}
}
        } // c go

تم تعديل هذه المشاركة بواسطة Dr.Robert في 22 مارس 2010 في 23:05

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#15

بالضبط مثل ما قلتو يا شباب .. كان عندي خطأفي run

وايضا انتبهت لخطأ ثاني في .. qScroller

كنت كاتب Vertical مرتين ... مره حاطها ALWAYS ومره NEVER

عالعموم يعطيكم العافيه شباب ع المساعده

بس حاب استفسر عن نقطه في BufferedReader

لفت نظري في موضوع قديم لـ Eisa Ayed

في شرحه للقراءه من كونسول كما قال.. استخدم طريقه لل BufferedReader اسهل من الي موجوده في برنامجي..

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

وفي برنامجي كانت مكتوبه بهذي الطريقه..

sock = new Socket("127.0.0.1", 5000);
            InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
            reader = new BufferedReader(streamReader);

النقطه التي تهمني هيه استخدامه System.in كبارامتر بدلاً من كتابة الـ instance of InputStreamReader

سؤالي هو.. هل بستطاعتي استخدام هذه الطريقه؟

لو كان هذا ممكن.. كيف سيكون شكل الكود في برنامجي ؟

تم تعديل هذه المشاركة بواسطة محمد_ح في 27 مارس 2010 في 23:53

نداء ما كان بعيداً

#16

ستحصل في الحالتين على instance of InputStreamReader، كل ما في الأمر أنك في الحالة الأولى تحدد مصدر القراءة في System.in، أي لوحة المفاتيح، بينما في الحالة الثانية تحدد مصدر القراءة في sock.getInputStream()، أي ما يتلقاه ال socket عبر الشبكة

#17
محمد_ح كتب:

لو كان هذا ممكن.. كيف سيكون شكل الكود في برنامجي ؟

جربت مسحت البارامتر لـ BufferedReader

وكتبت بداله System.in .. System.out

يعطيني خطأ.. يقول cannot find symbol

هل هو يحتاج إلى import معين ؟

وهل سيقوم بطباعة ما سيأتي من الشبكه ؟

نداء ما كان بعيداً

#18

أين هذا ال parameter من صنف BufferedReader؟؟؟؟!!!!!!!!!

وهل System.in هو System.out؟؟؟!!!!

System.in هو من صنف InputStream، و System.out من صنف PrintStream، وهما فئتين مختلفتين تماما

BufferedReader يحتوي على الطريقة readLine التي تمكن من قراءة سطر

System.out.println(".....")

تسمح بكتابة سطر ما في سطر الأوامر

#19

خليني اكون اوضح شوي..

هذا جزء من البرنامج الي فوق:

    private void setUpNetworking() {

        try {
            sock = new Socket("127.0.0.1", 5000);
            InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
            reader = new BufferedReader(streamReader);
          //  reader = new BufferedReader(System.in);
            writer = new PrintWriter(sock.getOutputStream());
            System.out.println("netwotking established");
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    } // close setup networking

لما انا سألت..

اقتباس
لو كان هذا ممكن.. كيف سيكون شكل الكود في برنامجي ؟

الي كنت اقصده هو وين احط System.in

انت قلت لي سابقاً ان

اقتباس
ستحصل في الحالتين على instance of InputStreamReader

لهذا وضعتها هنا ..

reader = new BufferedReader(System.in);

لكن عطاني error

نداء ما كان بعيداً

مواضيع مشابهة