Java 此程序挂起

Java 此程序挂起,java,Java,注意-我已尝试使我的电脑同时具有服务器和客户端 我尝试了很多,但无法理解我的程序挂起的原因 每当我点击连接,程序就会挂起 客户端 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.net.*; import java.io.*; class chatboxClient { JFrame fr; JPanel p; JButton send; JTextArea ta; JRadi

注意-我已尝试使我的电脑同时具有服务器和客户端

我尝试了很多,但无法理解我的程序挂起的原因

每当我点击连接,程序就会挂起

客户端

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
 class chatboxClient {
 JFrame fr;
 JPanel p;
 JButton send;
 JTextArea ta;
 JRadioButton rb;
 chatboxServer cbS=new chatboxServer();

 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) {
  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();
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");
  }
}

服务器端

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);
}

}

我认为引起问题的部分是当我调用
Laccept()

输出:


请帮我个忙。

你一直在等一个包裹。我建议您在发送数据包和收到数据包时都要登录。或者使用调试器执行相同的操作


UDP是一种有损协议,除非您的接收者在发送数据包时正在侦听,否则数据包将丢失(由于各种原因,数据包可能会丢失)

程序将在
Laccept
中等待TCP端口3000上的连接。 由于这是在
actionPerformed
中调用的,因此它会阻止事件分派线程(EDT)。这是负责管理GUI事件和更新屏幕的线程。当EDT被阻止时,GUI将被阻止-帧不会被更新,对输入没有反应。。。应用程序挂起
您必须在另一个线程中运行此类代码,以避免阻塞EDT:请参阅

在发布的代码中,没有一个到端口3000的TCP连接被打开
像您这样的用户混合使用TCP(套接字、服务器套接字)和UDP(DatagramSocket)。
首先,请参见和

编辑:
基本思想:

// run outside the EDT
thread = new Thread(new Runnable() {
    @Override 
    public void run() { 
        Laccept();
    } 
}); 
thread.start();
Obs:
invokeLater
用于强制代码在EDT中运行。文件说:

导致在AWT事件调度线程上异步执行doRun.run()


我修正了一些拼写错误,谢谢。“你有什么特别的东西要我补充吗?”彼得·劳瑞:我无法理解你的答案。除非你给我一个提示,否则我不知道你不明白的是什么@Peter Lawrey“你一直在等一个包裹”。我怎么在等呢?我解释了为什么它会带来不同。你怀疑什么?可靠地使用UDP是一种高级编程技术。我建议您在尝试使用UDP之前,应该知道如何使用TCP套接字。@Carlos Heuberger它仍然不起作用……我在main方法
SwingUtilities.invokeLater中尝试了这个方法(new Runnable(){public void run(){new chatboxClient();})
@Suhail-这没有帮助,因为
Laccept
没有在另一个线程中执行,因为它仍然在
actionPerformed
中被直接调用
actionPerformed
始终在EDT中运行(当GUI调用时)。您是否尝试过我上面推荐的教程???@Suhail Gupta:我印象深刻!!我更新了我的答案并添加了一个示例。@Carlos Heuberger我到目前为止还没有成功。我尝试过这个
尝试{r=new Runnable(){public void run(){cbS.Laccept());}};}catch(Exception exc){}SwingUtilities.invokeLater(r);
@Carlos Heuberger上述尝试也会挂起程序。请建议一种解决方法
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");
      }  
  }
 } 
// run outside the EDT
thread = new Thread(new Runnable() {
    @Override 
    public void run() { 
        Laccept();
    } 
}); 
thread.start();