Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Крестики нолики


Автор: DenWPF 3.10.2010, 15:10
Сервер есть, он принимает строку вида x=value:y=value;


Теперь клиент.

Создаю форму:
и тут сразу вопрос как подключить к кнопкам слушатель события?

Код

        setLayout (new GridLayout(3, 3));    // 3 rows, 3 columns, no gaps
        Button b;
        int i=0;
        for (int row = 0; row < 3; row ++)
        {
            b = new Button();
            b.setName("Button:X="+i+":Y="+row);
            add (new Button());
            b = new Button();
            b.setName("Button:X="+i+":Y="+row);
            add (new Button());
            b = new Button();
            b.setName("Button:X="+i+":Y="+row);
            add (new Button());
            i++;
        }


далее подключаюсь:

Код

Socket kkSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;
    void Client() throws IOException
    {
        try {
            kkSocket = new Socket("localhost", 3123);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
        } catch (UnknownHostException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection.");
            e.printStackTrace();
            System.exit(1);
        }
    }


а это то что должно быть при каждом клике.(отправка сообщения)
но как видете оно у меня не верно, потому что я не понимаю где и как это делать.

Код

    void Send(Object b) throws IOException
    {
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String fromServer;
        String fromUser;

        while ((fromUser = stdIn.readLine()) != null) {
            if (fromUser.equalsIgnoreCase("bye")) {
                break;
            }
            out.println(fromUser);
            System.out.println("Send to server: " + fromUser);
            fromServer = in.readLine();
            System.out.println("Received from server: " + fromServer);
        }
        out.close();
        in.close();
        stdIn.close();
        kkSocket.close();
    }


 smile 

Автор: jk1 4.10.2010, 15:32
Цитата

и тут сразу вопрос как подключить к кнопкам слушатель события?

Код

button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
              // разместите здесь все, что должно произойти при нажатии на кнопку
            }
        });

Автор: DenWPF 5.10.2010, 00:33
это анонимный! 

я уже разобрался как нормальный создавать...

а вот как отключить слушатель из самого себя я не понял

Автор: jk1 5.10.2010, 09:16
Цитата

это анонимный! 

я уже разобрался как нормальный создавать...

А чем анонимный не "нормальный"?  smile 
Цитата

а вот как отключить слушатель из самого себя я не понял 

Этот обработчик при нажатии на кнопку удалит самого себя, с "нормальным" по аналогии
Код

        final JButton button = new JButton();
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                button.removeActionListener(this);
            }
        });

В случае когда в контексте обработчика нет ссылки на кнопку-источник, работает вот такой подход:
Код

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ((JButton)e.getSource()).removeActionListener(this);
            }
        });

Автор: DenWPF 5.10.2010, 11:17
ага спасибо вот только что сам разобрался.
сейчас трабл со связью на втором ходе человека выдает такое:


Цитата

05.10.2010 11:12:34 noughtsandcrosses.Main$CommandButton actionPerformed
SEVERE: null
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at java.io.BufferedReader.fill(BufferedReader.java:136)
        at java.io.BufferedReader.readLine(BufferedReader.java:299)
        at java.io.BufferedReader.readLine(BufferedReader.java:362)
        at noughtsandcrosses.Main.Send(Main.java:118)
        at noughtsandcrosses.Main$CommandButton.actionPerformed(Main.java:76)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

с чем это может быть связано

Автор: jk1 5.10.2010, 11:33
Цитата

с чем это может быть связано


Приводите код, желательно полностью. Без этого точную причину назвать сложно.

Автор: DenWPF 5.10.2010, 13:37
Сервер:
Код

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
import java.util.Vector;

/**
 *
 * @author User
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(3123);
        Socket acceptor = socket.accept();
        PrintWriter out = new PrintWriter(acceptor.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(acceptor.getInputStream()));
        String input = null;
        Vector<Point> mass = new Vector<Point>();
        Random r = new Random();
        while ((input = in.readLine()) != null){
            
            mass.add(new Point(input, 0));

            if(mass.size()==9)
            {}

            int randX =-1;
            int randY = -1;
            while(true)
            {
                randX = r.nextInt(3);
                randY = r.nextInt(3);
                for (int i = 0; i < 9-mass.size(); i++)
                {
                    if(mass.elementAt(i).getX() != randX && mass.elementAt(i).getY() != randY)
                    {
                        Point newp = new Point(randX+":"+randY+":1");
                        mass.add(newp);
                        out.println("Button:"+randX+":"+randY);
                        break;
                    }
                }
            }
        }
    }
}


у меня классы поинты нужны для сервера и клиента различаются..это все из-за лени:

Код

package slovaserver;

/**
 *
 * @author User
 */
public class Point {

    @Override
    public String toString() {
        return x+":"+y+":"+value;
    }


    private int x;
    private int y;
    private int value;
    public Point(int x, int y, int value) {
        this.x = x;
        this.y = y;
        this.value = value;
    }
    public Point(String str) {
        String[] s = str.split(":");
        this.x = Integer.parseInt(s[0].toString());
        this.y = Integer.parseInt(s[1]);
        this.value = Integer.parseInt(s[2]);
    }

    public Point(String str, int value) {
        String[] s = str.split(":");
        this.x = Integer.parseInt(s[1].toString());
        this.y = Integer.parseInt(s[2]);
        this.value = value;
    }
    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }

}



клиент:
Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package noughtsandcrosses;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JComponent;

/**
 *
 * @author User
 */
public class Main extends JFrame {

    public Main() throws IOException{
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //this.setLayout(null);
        this.setSize(250,250);

        GridLayout gl = new GridLayout(3, 3);
        setLayout (new GridLayout(3, 3));    // 3 rows, 3 columns, no gaps
        JButton b;
        
        for (int row = 0; row < 3; row ++)
        {
            int i=0;
            b = new JButton();
            b.setName("Button:"+i+":"+row);
            i++;
            b.addActionListener(new CommandButton());
            add (b);
            b = new JButton();
            b.addActionListener(new CommandButton());
            b.setName("Button:"+i+":"+row);
            i++;
            add (b);
            b = new JButton();
            b.setName("Button:"+i+":"+row);
            b.addActionListener(new CommandButton());
            add (b);

            
        }
      


        Client();


    }
    class CommandButton implements ActionListener
    {

        public void actionPerformed(ActionEvent e) {
                try {
                    JButton jb = (JButton)e.getSource();

                    jb.setBackground(Color.red);
                    Send(jb);

        jb.removeActionListener(this);
                    
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

    }



    Socket kkSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;
     BufferedReader stdIn = null;
    void Client() throws IOException
    {
        try {
            kkSocket = new Socket("localhost", 3123);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
            stdIn = new BufferedReader(new InputStreamReader(System.in));
        } catch (UnknownHostException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection.");
            e.printStackTrace();
            System.exit(1);
        }
    }
    void Send(JButton b) throws IOException
    {
        
        String fromServer;
        String fromUser;

        fromUser = b.getName();
        out.println(fromUser);
        System.out.println("Send to server: " + fromUser);
        fromServer = in.readLine();
        this.getComponents();
        //Найти Кнопку нажатую и задать задний фон и удалить обработчик
        Component[]x=this.getContentPane().getComponents();
        for(int i=0;i<x.length;i++)
        {
            JButton but = (JButton)x[i];
            if(but.getName().equals(fromServer))
            {
                but.setBackground(Color.blue);
                but.removeActionListener(but.getActionListeners()[0]);
                stdIn.close();
                break;
            }


        }
        System.out.println("Received from server: " + fromServer);
        
    }
void Close() throws IOException
{
    out.close();
    stdIn.close();
        in.close();
        kkSocket.close();

}

    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        Main form = new Main();
        form.setVisible(true);
form.setResizable(false);
    }

}

клиент поинт 

Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package noughtsandcrosses;

/**
 *
 * @author User
 */
public class Point {

    @Override
    public String toString() {
        return x+":"+y+":"+value;
    }


    private int x;
    private int y;
    private int value;
    public Point(int x, int y, int value) {
        this.x = x;
        this.y = y;
        this.value = value;
    }
    public Point(String str) {
        String[] s = str.split(":");
        this.x = Integer.parseInt(s[0].toString());
        this.y = Integer.parseInt(s[1]);
        this.value = Integer.parseInt(s[2]);
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }

}


Автор: jk1 7.10.2010, 12:54
Причина в том, что Вы два раза пытаетесь удалять обработчик с кнопки. Поправленный вариант:
Код

 for (int i = 0; i < x.length; i++) {
            JButton but = (JButton)x[i];
            if (but.getName().equals(fromServer)) {
                but.setBackground(Color.blue);
                //but.removeActionListener(but.getActionListeners()[0]);
                stdIn.close();
                break;
            }
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)