2013-12-22 57 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

感谢您的评论我会考虑到这一点。大概我不会用这种方法关闭它。 –

相关问题