单击“连接”时没有任何反应

时间:2011-04-06 13:08:52

标签: java networking

注意:我已将我的机器设为服务器和客户端

这是我的完整代码:

客户端

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 :(得分:0)

首先必须决定是否要使用TCP或UDP进行连接。

TCP使用Socket和ServerSocket类,并为您提供连接,您可以通过该连接发送连续的字节流(并在另一个方向上接收另一个字节)。 TCP协议确保所有数据以正确的顺序到达。

UDP使用DatagramSocket类,并发送单个包,这些包可能会或可能不会到达另一方(通常它们会这样做,但是不能保证,并且您无法确定是否未实现确认你自己)。如果他们到达某个主机/端口并且没有进程在那里收听,他们将被丢弃。

通常,混合两者都没有意义。


你的程序在一个接一个的同一个线程中使用UDP sendreceive,这将导致接收套接字无法读取它,因为数据包已被丢弃。您必须在单独的线程中调用receive,然后才能发送包。


编辑(在您的评论之后):

这是UDP工作的方式。传入包没有队列。 ds.receive(dp);调用等待从现在开始到达的新软件包,而不是过去某个时间发送的软件包。所以这个调用将永远阻塞(另外在事件调度线程上,意味着你没有得到任何重绘或其他事件处理)。

就像在新线程中启动connect()方法一样,也可以在新线程中启动服务器的Receive方法。 (事实上​​,您的服务器的Laccept并未用于任何事情。)

除此之外,您的两个DatagramSockets(客户端1和服务器1)绑定到同一本地端口,这也可能导致问题。不要这样做。