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