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

Не уверен, что это поможет этой проблеме, но поймать Исключения и ничего не делать никогда не будет хорошей идеей. Добавьте, по крайней мере, println, чтобы убедиться, что у вас нет исключения. – jzd

ответ

1

Ответ на вопрос:

ошибка с прохождением переменных из основного метода

Ваш основной метод ничего не передает конструктору JFrame. Вместо этого конструктор создает новый TCP-клиент и запускает его снова. Конструктор должен быть определен как

public NewJFrame(TCPClient tcpClient) { 
    ... 

И главный метод должен пройти TcpClient, что он уже создан и запущен в конструктор.

+0

спасибо, что он сработал –

1

Поскольку вы закрываете соединение сокета в своем методе actionPerformed, я бы предложил открыть там соединение.

Рассуждение:

  1. Если открыть соединение вне метода вы можете никогда не закрыть его.
  2. Если это действие вызывается дважды, это не удастся. Я понимаю, что по дизайну это следует вызывать только один раз, но вы должны быть готовы к тому, чтобы кто-то изменил код после вас.
  3. Это работает, и вы не опубликовали достаточно информации в вопросе, чтобы узнать, почему это не работает.
+0

спасибо за ваш комментарий, я это учту. вероятно, я не закрою его в этом методе. –

Смежные вопросы