这就是我正在编写的代码。这只是一种实践,这让我困扰了一段时间。问题是我试图将第二个类中传递的参数(UDPServer 服务器)应用到该类的全局变量( myserv),这样我就可以在 run 方法中使用它。问题是它说 server 不是 NULL(这是可以的,它可以工作),但是 myserv 是 NULL 并且它不会改变......这可能是一些愚蠢的错误,但我好像没找到。
package Server;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class UDPServer{
JFrame frame;
JPanel panel;
JButton button1,button2;
JTextArea area;
JScrollPane pane;
StartThread thread1;
UDPServer u;
public static void main(String[] args) {
UDPServer u = new UDPServer();
}
public UDPServer(){
frame = new JFrame("Text Server");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.getRootPane()
.setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
panel = new JPanel();
panel.setLayout(null);
area = new JTextArea();
area.setEditable(false);
button1 = new JButton("Start");
button1.setBounds(210, 10, 75, 40);
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
thread1 = new StartThread(u);
}
});
panel.add(button1);
button2 = new JButton("Stop");
button2.setBounds(300, 10, 75, 40);
button2.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent ae){
thread1.thread.interrupted();
thread1.socket.close();
area.append("Server is stopped\n");
button1.setEnabled(true);
button2.setEnabled(false);
}
});
button2.setEnabled(false);
panel.add(button2);
pane = new JScrollPane(area);
pane.setBounds(10, 60, 365, 250);
panel.add(pane);
frame.add(panel);
frame.setSize(400, 400);
frame.setVisible(true);
}
}
这是第一个类,这是第二堂课。
package Server;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class StartThread implements Runnable{
DatagramSocket socket;
private final UDPServer myserv;
Thread thread;
StartThread(UDPServer server){
myserv = server;
thread = new Thread(this);
thread.start();
myserv.button1.setEnabled(false);
myserv.button2.setEnabled(true);
}
public void run(){
try{
byte[] buffer = new byte[1024];
int port = 8080;
try{
socket = new DatagramSocket(port);
while(true){
try{
myserv.area.append("Server is started\n");
//Receive request from client
DatagramPacket packet =
new DatagramPacket(buffer, buffer.length );
socket.receive(packet);
InetAddress client = packet.getAddress();
int client_port = packet.getPort();
myserv.area.append(" Received "
+new String(buffer)+" from "+client);
}
catch(UnknownHostException ue){}
}
}
catch(java.net.BindException b){}
}
catch (IOException e){
System.err.println(e);
}
}
}
最佳答案
这是一些丑陋的代码。
对于初学者,我会将 UDPServer
设为一个单独的类。
这是你的问题:
你的类有一个私有(private)成员变量u
:
UDPServer u;
您没有初始化它,因此引用设置为 null。
您的 main 方法声明了一个相同类型的局部变量 u
。
两者完全无关。您正在查看“new UPDServer”并想象您正在初始化私有(private)成员变量。这就是让你感到困惑的地方。
在构造函数中初始化UDPServer
成员变量。
一旦你这样做了,你就会遇到另一个问题:它在静态上下文中无法被引用。听起来你的下一个问题都在排队......
关于Java不会改变变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787581/