Ничего не происходит, когда я нажимаю кнопку Подключиться - PullRequest
0 голосов
/ 06 апреля 2011

Примечание. Я сделал свой компьютер и сервером, и клиентом

Это мой полный код:

Клиентская сторона

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.lang.Thread;

class chatboxClient {

    JFrame fr;
    JPanel p;
    JButton send;
    JTextArea ta;
    JRadioButton rb;
    static chatboxServer cbS=new chatboxServer();
    public Thread connectThread;

    chatboxClient() {
        fr=new JFrame("ChatBox_CLIENT");
        p=new JPanel();
        send=new JButton("send");
        send.addActionListener(new ActionListener() {       // action listener for send
                public void actionPerformed(ActionEvent ae) {
                    sendActionPerformed(ae);
                }
            });

        ta=new JTextArea();
        ta.setRows(20);
        ta.setColumns(20);
        rb=new JRadioButton("Connect");               // action listener for connect
        rb.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    connectActionPerformed(ae); 
                }
            });
        fr.add(p);
        p.add(ta);
        p.add(rb);
        p.add(send);
        fr.setSize(500,500);
        fr.setResizable(false);
        fr.setVisible(true);
    }
    public void connectActionPerformed(ActionEvent ae) {
        EnsureEventThread();
        CreateConnectThread();
    }
    public void CreateConnectThread() {             // Seperate Thread created for handling 'connect'
        Runnable r=new Runnable() {
                public void run() {
                    connect();
                }
            };
        connectThread=new Thread(r,"Connect Thread");
        connectThread.start();
    }

    public void connect() {
        try {
            cbS.Laccept();
            rb.setEnabled(false);
            JOptionPane.showMessageDialog(new JFrame()," Sockets InterConnected!");
        } catch(Exception exc) {
            JOptionPane.showMessageDialog(new JFrame()," Connection Error..");
        }
    }
    public void sendActionPerformed(ActionEvent ae) {
        try { 
            String s=ta.getText();
            InetAddress address=InetAddress.getLocalHost();
            DatagramSocket ds=new DatagramSocket(3000,address);
            byte buffer[]=new byte[800];
            buffer=s.getBytes();
             Runnable rR=new Runnable() {   // Seperate thread for 'Receive'
                public void run() {
                  cbS.Receive(s);
                }
             };
             Thread TReceive=new Thread(rR,"Receive Thread");
             TReceive.start();
            DatagramPacket dp=new DatagramPacket(buffer,buffer.length,address,3000);
            if(true) {
                ds.send(dp);

                cbS.Receive(s); // call Receive method of chatboxServer class
            }
            catch(Exception exc) {
                JOptionPane.showMessageDialog(new JFrame(),"Error sending Message");
            }
        }  
    }

    public void EnsureEventThread() {
        try { 
            if(SwingUtilities.isEventDispatchThread()) 
                return;
        } catch(Exception exc) {
            System.out.println(exc);
        }
    }


    public static void main(String args[]) {
        chatboxClient cbC= new chatboxClient();
    }
}

Серверная сторона

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

class chatboxServer {
    JFrame fr;
    JPanel p;
    JTextArea ta;
    JButton send;
    ServerSocket ss;
    byte buffer[]=new byte[800];

    chatboxServer() {
        fr=new JFrame("ChatBox_SERVER");
        p=new JPanel();
        ta=new JTextArea();
        ta.setRows(20);
        ta.setColumns(20);
        send=new JButton("send");
        fr.add(p);
        p.add(ta);
        p.add(send);
        fr.setVisible(true);
        fr.setSize(500,500);
        fr.setResizable(false);

    }

    public void Receive(String sm) {
        try {
            buffer=sm.getBytes();
            InetAddress address=InetAddress.getLocalHost();
            DatagramSocket ds=new DatagramSocket(3000,address);
            DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
            ds.receive(dp);
            String s=new String(dp.getData(),0,dp.getLength());
            ta.setText(s);  
        }    catch(Exception exc) {
            System.out.println("Error Receiving..");
        }
    }

    public void Laccept() {
        try {
            ss=new ServerSocket(3000);     // First making port number 3000 on server to listen
            Socket s=ss.accept();
        }   catch(Exception exc) {
            JOptionPane.showMessageDialog(new JFrame(),"Accept Failed :3000 :Server Side");
        }  
    }
}

ПРОБЛЕМА --- Ничего не происходит, когда я нажимаю кнопку подключения.В чем проблема?

Одна вещь, которую я проверил: Программа ожидает ss.accept (); , поэтому я думаю, что оператор, следующий за вызовом Laccept (), делаетне работает ...

Обратите внимание, что моя цель с помощью приведенного выше кода - отправить сообщение на сервер, который является той же машиной, на которой работает клиент

Пожалуйста, объяснитеясно, что мне делать?

1 Ответ

0 голосов
/ 06 апреля 2011

Сначала вы должны решить, хотите ли вы использовать TCP или UDP для вашего соединения.

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

UDP использует класс DatagramSocket и отправляет отдельные пакеты, которые могут или не могут прийти на другую сторону (обычно они поступают, но нет никакой гарантии, и вы не можете узнать, если вы не реализуете подтверждение сам). Если они достигают какого-либо хоста / порта и там не происходит прослушивания процессов, они просто отбрасываются.

Нет смысла смешивать оба, обычно.


Ваша программа использует UDP send и receive в одном и том же потоке один за другим, что приведет к тому, что у принимающего сокета не будет возможности прочитать его, поскольку пакет уже был отброшен. Вы должны позвонить на получение в отдельном потоке, и перед отправкой пакета.


Редактировать (после вашего комментария):

Так работает UDP. Для входящих пакетов нет очереди. Вызов ds.receive(dp); ожидает новых пакетов, поступающих с этого момента, а не пакетов, которые были отправлены когда-то в прошлом. Так что этот вызов просто заблокируется навсегда (и, кроме того, в потоке отправки событий, что означает, что вы не получите перерисовок или другой обработки событий).

Подобно тому, как вы запускаете метод connect () в новом потоке, также запускаете метод сервера Receive в новом потоке. (На самом деле, Laccept вашего сервера ни для чего не используется.)

Кроме этого, ваши две DatagramSockets (клиентская и серверная) связаны с одним и тем же локальным портом, что также может вызвать проблему. Не делай этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...