2011-10-16 97 views
0

所以這是我工作的代碼。它只是一個練習,這是一個困擾了我一段時間的問題。問題是,我試圖將第二個類中傳入的參數(UDPServer服務器)應用於該類的全局變量(myserv)我可以在運行方法中使用它。問題是,它說,服務器不爲NULL(這是確定它的工作原理),但myserv是NULL,它難道不改變...它可能是一些愚蠢的錯誤,但我似乎無法找到它。的Java不會改變一個變量

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

這段代碼太相互依賴;你在創建'UDPServer'的時候創建了'StartThread',並且每個都依賴於另一個。使代碼更少耦合。 –

回答

1

這是一些醜陋的代碼。

對於初學者來說,我會作出這樣的UDPServer一個單獨的類。

這是你的問題:

你的類有一個私有成員變量u

UDPServer u; 

你不初始化,所以基準設置爲null。

你的主要方法聲明相同類型的局部變量u

兩個是完全無關。您正在查看「新UPDServer」並想象您正在初始化私有成員變量。這就是讓你困惑的原因。

在構造初始化UDPServer成員變量。

一旦你這樣做,你會有另一個問題:它不會在靜態的上下文中參考。聽起來像你的下一個問題是全部排隊......

+0

不,我知道如何解決這個問題,謝謝你的回答:) – Zee