2013-12-22 89 views
0

我有一個啓動與服務器連接的方法的主類。 在JFrame類我有一個按鈕註冊,當按下它將檢索用戶輸入並將其發送到服務器。 我的問題是,與服務器的連接不能正常工作,因爲傳遞主方法中的變量時出現錯誤。 我試圖在JFrame類中聲明連接的變量,並在構造函數中將它們分配給主類變量,但這也不起作用。如何將主類中的TCP連接變量傳遞給另一個JFrame類?

主類:

 public class TCPClient { 
    Socket clientSocket; 
DataOutputStream outToServer; 
BufferedReader inFromServer; 
String test; 


public void start() throws Exception{ 
    clientSocket= new Socket("localhost", 6789); 
    outToServer= new DataOutputStream(clientSocket.getOutputStream()); 
    inFromServer= new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    test="abc"; 

} 

public static void main(String[] args) throws Exception { 
    TCPClient c=new TCPClient(); 

    c.start(); 
     NewJFrame j=new NewJFrame(); 
     j.setVisible(true); 
    }} 

JFrame類:

public class NewJFrame extends javax.swing.JFrame { 
    JTextField username = new JTextField(); 
    JTextField name = new JTextField(); 
JTextField Email = new JTextField(); 
JTextField Address = new JTextField(); 
    JTextField password = new JPasswordField(); 


    BufferedReader inFromUser; 
    Socket clientSocket; 
    DataOutputStream outToServer; 
    BufferedReader inFromServer; 
    String test; 


public NewJFrame() throws Exception { 
    TCPClient c=new TCPClient(); 
    c.start(); 
    inFromServer=c.inFromServer; 
    clientSocket=c.clientSocket; 
    outToServer=c.outToServer; 
    inFromServer=c.inFromServer; 
    test=c.test; 
    initComponents(); 
     } 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
System.out.print(test); 
    Object[] message = { 
"Full Name:", name, 
"Email:", Email, 
"Address:", Address, 
"Username:", username, 
"Password:", password 
}; 

    int option = JOptionPane.showConfirmDialog(null, message,"Sign in",JOptionPane.OK_CANCEL_OPTION); 

    try{ 

    System.out.print(test); 

    outToServer.writeBytes("signup"+ '\n'); 
    outToServer.writeBytes(name.getText() + '\n'); 
    outToServer.writeBytes(Email.getText() + '\n'); 
    outToServer.writeBytes(Address.getText() + '\n'); 
    outToServer.writeBytes(username.getText() + '\n'); 
    outToServer.writeBytes(password.getText() + '\n'); 

    JOptionPane.showMessageDialog(null, inFromServer.readLine()); 

    clientSocket.close(); 

    } 
    catch(Exception e) 
    { 

    } 
+0

請展開「沒有工作」。發生了什麼?你期望會發生什麼? – jzd

+0

服務器沒有從客戶端「outToServer.writeBytes()」接收,但是當我初始化jButton1ActionPerformed方法中的連接而不是主類時,它的工作原理 –

+0

不確定這是否會幫助解決這個問題,但是捕獲Exceptions和什麼都不做是一個好主意。至少添加一個println以確保您沒有發生異常。 – jzd

回答

1

答案就在問題:

從main方法傳遞變量是錯誤

您的主要方法不會將任何內容傳遞給JFrame構造函數。相反,構造函數創建一個新的TCP客戶端並再次啓動它。構造函數應該定義爲

public NewJFrame(TCPClient tcpClient) { 
    ... 

而主要方法應該將TCPClient(它已經創建並啓動)傳遞給構造函數。

+0

謝謝你的工作 –

1

由於您在actionPerformed方法中關閉了套接字連接,所以我建議在那裏打開連接。

推理:

  1. 如果打開的方法之外的連接你可能永遠不會關閉它。
  2. 如果此操作被稱爲兩次,它將失敗。我通過設計意識到這應該只被調用一次,但是你必須準備好讓別人在你之後改變代碼。
  3. 它的工作原理和你沒有發佈足夠的信息在問題中,以告訴爲什麼不工作,否則。
+0

感謝您的評論我會考慮到這一點。大概我不會用這種方法關閉它。 –

相關問題