2016-05-09 2 views
0

Это мой класс сервера, который открывает сокет сервера, чтобы получить информацию от одного клиента, а затем использует класс пользователей, чтобы отправить строку для всех пользователей в массиве:Почему сервер не пишет клиенту?

public class Server { 
    static ServerSocket server; 
    static Socket client; 
    static DataOutputStream out; 
    static DataInputStream in; 
    static int port = 7767; 
    static Users[]User = new Users[10]; 

public static void main(String[] args)throws Exception{ 
    try { 
     System.out.print("starting"); 
     server = new ServerSocket(port); 
     while((client = server.accept())!= null){ 

      for(int i=0; i<10; i++){ 
       // System.out.println("input connection"); 
       out= new DataOutputStream(client.getOutputStream()); 
       in = new DataInputStream(client.getInputStream()); 
       if(User[i] == null) 
       { 
        User[i] = new Users(out, in, User); 
        Thread thread = new Thread(User[i]); 
        thread.start(); 

       } 
      } 
     } 

      } catch (IOException e) { 

       e.printStackTrace(); 


} 

Этот класс пользователей просто содержит информацию о том, кто является клиентом, а затем посылает всем пользователям строка, что сервер был отправлен, я использовал, чтобы получить NullPointException для message = in.readUTF();, но теперь ничего не происходит вообще.

public class Users implements Runnable { 
DataOutputStream out; 
DataInputStream in; 
Users[] User = new Users[10]; 
public Users(DataOutputStream out, DataInputStream in, Users[] User) 
{ 
    this.in = in; 
    this.out = out; 
    this.User = User; 

} 
public void run(){ 
    while(true){ 
     try{ 
      BufferedReader bri = new BufferedReader(new InputStreamReader(in)); 

     String message; 
     message = bri.readLine(); 

      for(int i=0; i<10; i++){ 
       if(User[i] != null) 
      { 
        BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out)); 
       User[i].br.write(message + "\n"); 
       } 

      } 

     } 
     catch(IOException e){ 
    // catching and doing something about it and stuff 
     } 

} 
}` 

Клиент: (минус все качели вещи, чтобы сохранить вопрос пространства)

public class Client implements WriteGui { 
static Socket client; 
static DataInputStream in; 
static DataOutputStream out; 
JTextArea msgout; 
private JFrame frame; 
private JTextField msgA; 
private JTextField nameA; 



/** 
* Create the application. 
*/ 
public Client() { 
    initialize(); 
    CStart(); 
}` 

    public void actionPerformed(ActionEvent arg0) { 
      if(nameA.getText() == ""){ 
      nameA.setText(getname()); 


      } 
      String message; 

      message = (nameA.getText()+": "+ msgA.getText()); 

     try { 
       BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out)); 
       br.write(message+"\n"); 


      } catch (IOException e) { 
      msgout.append("error!"); 

      } 


     } 
public void write(String s) { 
    msgout.append(s+ "/n"); 

} 
private String getname(){ 
    return JOptionPane.showInputDialog(frame,"fill out name" , "name", JOptionPane.QUESTION_MESSAGE); 



} 
public void CStart(){ 
int port = 7767; 
    String host = "localhost"; 
    try { 

    client = new Socket(host, port); 
    msgout.append("starting"); 
    in = new DataInputStream(client.getInputStream()); 
    out = new DataOutputStream(client.getOutputStream()); 
    Input input = new Input(in, this); 
    Thread thread = new Thread(input); 
    thread.start(); 

    } 

    catch(Exception e) { 
     msgout.append("error"); 
    } 

У меня также есть короткий класс ввода, который вводит сообщения в клиенте:

public class Input implements Runnable { 
WriteGui gui; 
DataInputStream in; 
static BufferedReader br; 
public Input(DataInputStream in, WriteGui gui){ 
    this.in = in; 
    this.gui = gui; 

} 

public void run() { 
    String message; 
br = new BufferedReader(new InputStreamReader(in)); 
try { 
    message = br.readLine(); 
    gui.write(message); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

как Я сказал, что получил ошибку, прослеженную к классу Users, но исключение NullPointerException не гарантируется. По-прежнему это похоже на код «Сервер/Пользователи», хотя, поскольку он использует больше ресурсов, он должен. Может ли кто-нибудь помочь мне понять, почему этот Datainputstream не работает?

Edit: он прекратил производство NullPointerException, и теперь после нажатия кнопки старта после нескольких попыток вместо сообщения, он отправляет форму коробки. Таким образом, это похоже на проблему с чтением UTF. даже с изменением OutputStreamWriter только на DataInputStream, это не сработает.

+0

StackTrace, пожалуйста? –

+0

Я думаю, что проблема в том, что вы пишете данные, используя 'OutputStreamWriter' и вы пытаетесь читать его с помощью' DataInputStream'. Попробуйте использовать один и тот же тип потока для записи/чтения данных. – Titus

+0

я попытался использовать только DataInputStream и это не сработало, и именно поэтому я посмотрел его и кто-то предложил в OutputStreamWriter для подобной проблемы – Alexandre

ответ

1

Для использования метода readUTF() данные должны быть отформатированы определенным образом, что не так, когда вы пишете его с помощью OutputStreamWriter.

Я предлагаю вам использовать BufferedReader и BufferedWriter, используйте write(string+"\n"), чтобы написать что-то и readLine() читать. Чтобы это сработало, вы должны добавить новую строку \n в конце каждого сообщения.

Вот пример:

try(BufferedWriter bw = new BufferedWritter(new OutputStreamWriter(socker.getOutputStream()))){ 
    bw.write(message + "\n"); 
}catch(IOException e){ 
    e.printStackTrace(); 
} 


try(BufferedReader br = new BufferedReader(new InputStreamReader(socker.getInputStream()))){ 
    String message = br.readLine(); 
}catch(IOException e){ 
    e.printStackTrace(); 
} 
+0

Вы бы предложили сделать это с обеих сторон потока? – Alexandre

+0

@Alexandre Да, вы должны использовать тот же тип читателя, что и писатель. И если вы читаете данные по строкам (используя 'readLine()'), убедитесь, что вы завершаете свои сообщения новым символом строки \ n. – Titus

+0

Это странно. Я только что проверил это пару раз, используя это предложение, и это не помогло. Ящик и другие странные символы, которые я получил, ушли, но отправленное сообщение не появилось. – Alexandre

1

Как вы теперь с помощью BufferedWriter, вы должны flush() его в соответствующие моменты времени, то есть при переходе от письма к чтению.

+0

в порядке. вы могли бы быть достаточно хороши, чтобы представить пример или указать мне на другое место? потому что я предполагаю, что мне нужно синхронизировать его или время его, как будто я просто зачищаю автора, он может это сделать до того, как выходной поток будет получен с сервера? – Alexandre

+0

Вам не нужен пример одной строки кода. Не создавайте мнимые проблемы. Просто промойте его, прежде чем читать. Это не сложно. Я не могу понять эту часть после «потому что». – EJP

+0

Я снова получаю исключение NullPointerException, если я запускаю код с флешем после отправки сообщения на сервер, а также получаю ошибку исключения, если я очищаю поток сразу после отправки сообщения клиенту. – Alexandre

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