2016-04-23 3 views
0

Я пытаюсь сделать клиент-серверное соединение. Сначала я выполнил код сервера в одной консоли, а затем клиентский код в другой консоли. Я хочу, чтобы после того, как клиентский код запускается, клиент вводит свое имя, а затем создам объект класса сокета клиента и печатаю имя клиента в консоли сервера. Но на консоли сервера он печатает null, когда я пытаюсь напечатать имя клиента.Почему следующий код печатает нуль?

Поскольку accept() метод класса сервера ожидает клиент объекта сокета, поэтому перед этой линией System.out.println(Myclient1.nameOfClient + " connected"); запускается на выполнение, клиент будет уже вписал свое имя в StringnameOfClient.

Я не могу понять причину этого.

Серверный код

public Myserver1() { 
    try { 
     ss = new ServerSocket(10); 
     while (true) { 
      s = ss.accept(); // waits for the client socket 
      System.out.println(Myclient1.nameOfClient + " connected"); // Here I want to print the name of client(Myclient1.java). 

      al.add(s); 
      Runnable r = new MyThread(s, al); 
      Thread t = new Thread(r); 
      t.start(); 
     } 
    } catch(Exception e) {} 
} 

Клиентский код

public Myclient1() { 
    System.out.println("enter ur name"); 
    nameOfClient = new Scanner(System.in).nextLine(); // Here I am storing the name of client so that I can access nameOfClient from Myserver1.java 

    try { 

     s = new Socket("localhost", 10); 

     din = new DataInputStream(s.getInputStream()); 
     dout = new DataOutputStream(s.getOutputStream()); 
     clientchat(); 
    } catch(Exception e) {} 
} 

ответ

2

сервер и клиенты должны работать независимо друг от друга, или же он побеждает цель сети. Прямо сейчас вы получаете доступ к статической переменной, которая никогда не была инициализирована, потому что клиент не работает в том же процессе, что и сервер. Отправляйте имя над сокетом и используйте это как свою печать, и ваша проблема будет исправлена.

+0

Спасибо, я понял. – a874

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