التحكم في Java Object باستخدام Sockets

السلام عليكم ، اريد كتابة برنامج بلفة جافا مستخدما الــSockets الفكرة الأساسية للبرنامج هي أن يقوم زبون (client) بالاتصال بــخادم (server) ، وذلك ليتحكم بكرة عن طريق لوحة المفاتيح (ببساطة عندما يستخدم الزبون لوحة مفاتيحه تتحرك كرته و كرة الخادم في نفس الوقت)، لقد قمت بكتابة البرنامج المشكلة هي أن عند تشغيله التحكم يتم في نافذة واحدة (يعني لا توجد علاقة بين النافذتين) و لا أعرف السبب الرجاء الاطلاع على البرنامج و مساعدتي .

class ball

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;


import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class balle extends JPanel implements ActionListener,KeyListener
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    double x=0, y=0, coor_x=0, coor_y=0;
    //A facility for threads to schedule tasks for future execution in a background thread.
    Timer t=new Timer(2, this);

    /*Constructeur*/
    public balle()
    {

        t.start();
        //Adds the specified key listener to receive key events from this component.
        addKeyListener(this);
        //Sets the focusable state of this Component to the specified value. This value overrides the Component's default focusability.
        setFocusable(true);
        //Sets whether focus traversal keys are enabled for this Component.
        setFocusTraversalKeysEnabled(true);


    }


    /*Calls the UI delegate's paint method, if the UI delegate is non-null.*/
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g1=(Graphics2D) g;
        //Fills the interior of a Shape using the settings of the Graphics2D context.
        g1.fill(new Ellipse2D.Double(x,y,40,40)); //The Double class defines an ellipse specified in double precision.


    }

    /*Invoked when an action occurs.*/
    public void actionPerformed(ActionEvent e)
    {
        if(x<0){coor_x=0; x=0;}
        if(x>balle.f.getWidth()-40){coor_x=0; x=balle.f.getWidth()-55;}

        if(y<0){coor_y=0; y=0;}
        if(y>balle.f.getHeight()-40){coor_y=0; y=balle.f.getHeight()-80;}



        x=x+coor_x;
        y=y+coor_y;
        repaint(); //Repaints this component.
    }


    /*HAUT*/
    public void up()
    {

            coor_y=-1;
            coor_x=0;


    }
    /*BAS*/
    public void down()
    {
        coor_y=1;
        coor_x=0;
    }

    /*GAUCHE*/
    public void left()
    {
        coor_x=-1;
        coor_y=0;
    }

    /*DROITE*/
    public void right()
    {
        coor_x=1;
        coor_y=0;
    }

    //Called just after the user presses a key while the listened-to component has the focus.
    public void keyPressed(KeyEvent e) 
    {
        int code=e.getKeyCode();

        if(code==KeyEvent.VK_UP) //Constant for the non-numpad up arrow key.
        {

            up();
        }

        if(code==KeyEvent.VK_DOWN) //Constant for the non-numpad down arrow key.
        {
            down();
        }

        if(code==KeyEvent.VK_LEFT)  //Constant for the non-numpad left arrow key.
        {
            left();
        }

        if(code==KeyEvent.VK_RIGHT) //Constant for the non-numpad right arrow key.
        {
            right();
        }
    }

    /*nvoked when a key has been typed.*/
    public void keyTyped(KeyEvent e){}

    /*Invoked when a key has been released.*/
    public void keyReleased(KeyEvent e)
    {
        coor_x=0;
        coor_y=0;
    }
    static JFrame f=new JFrame();
    public static void lancer_la_balle()
    {

        balle l=new balle();
        f.add(l);
        f.setVisible(true);
        //Sets the operation that will happen by default when the user initiates a "close" on this frame.
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("Balle.");
        f.setSize(300,300);


    }

}

***Class server* import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException;

public class server {
    private ServerSocket serverSocket = null;
    private Socket socket = null;
    private ObjectOutputStream outputStream = null;


    public server() {

    }

    public void communicate() {
        try {
            serverSocket = new ServerSocket(4445);
            System.out.println("Serveur demmare..");

            socket = serverSocket.accept();

            balle balle_env= new balle();

            balle.lancer_la_balle();
            balle.f.setTitle("Balle serveur.");

            outputStream = new ObjectOutputStream(socket.getOutputStream());
            outputStream.writeObject(balle_env);
            System.out.println("balle envoye");

            socket.close();

        } catch (SocketException se) {
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        server server = new server();
        server.communicate();
    }
}


***Class Client***
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.SocketException;

public class client {
    private Socket socket = null;
    private ObjectInputStream inputStream = null;
    private ObjectInputStream inStream = null;
    private boolean isConnected = false;

    public client() {

    }

    public void communicate() {

        while (!isConnected) {
            try {
                socket = new Socket("localHost", 4445);
                System.out.println("Client Connecte");
                isConnected = true;


                inStream = new ObjectInputStream(socket.getInputStream());
                balle balle_recu = null;
                try {
                    balle_recu = (balle) inStream.readObject();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                balle.lancer_la_balle();
                balle.f.setTitle("Balle client.");




            } catch (SocketException se) {
                se.printStackTrace();
                // System.exit(0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        client client = new client();
        client.communicate();
    }
}
يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

اقرا اولا عن RMI وطبق عليه امثلة.

بعدها فكرة بطريقة برمجتك ...

ايضا يمكنك حل المشكلة بطريقة اسهل .. فقط اجعل السرفير ينقل x و y بدلا من object باكلمه.

اذا اردت الحل بwriteObject كما قلت راجع RMI

ممكن مساعدة بخصوص X و Y ؟

تعديل على السريع .. الكود غير مرتب

طريقة بدلا من ارسال Objects ارسال فقط int x , int y

وعند وصوله لسرفير اعيد رسم مكان الكرة

مشكور أخي جزاك الله خيرا سأحاول اعادة ترتيب الكود و فهمه أكثر :)