2016-05-09 8 views
0

これは、1つのクライアントから情報を取得するためにサーバソケットを開き、アレイ内のすべてのユーザーに文字列を送信するために、クラスのユーザーを使用して、私のサーバークラスです:サーバがクライアントに書き込まないのはなぜですか?

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(); 


} 

このユーザークラスがちょうどの情報を保持していますクライアントであり、サーバーが送信された文字列をすべてのユーザーに送信します。これはmessage = in.readUTF();のNullPointExceptionを取得するために使用されましたが、現在は何も起こりません。

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は毎回発生することが保証されていません。それはまだそれがより多くのリソースを使用する必要がありますが、Server/Usersコードにあるようです。 このDatainputstreamが動作しないように見える理由は誰でも分かりますか?

編集:NullPointerExceptionの生成を停止し、メッセージの代わりに数回の試行後にstartを押すと、ボックスシェイプが送信されます。だから、UTFの読書には問題があるようです。 OutputStreamWriterをDataInputStreamだけに変更しても、動作しません。データを操作するreadUTF()方法ためには

+0

Stacktraceよろしいですか? –

+0

私は、問題はあなたが 'OutputStreamWriter'を使ってデータを書いていて、' DataInputStream'を使ってそれを読み込もうとしていると思います。同じ種類のストリームを使用してデータの書き込み/読み取りを試みます。 – Titus

+0

DataInputStreamだけを使ってみましたが、うまくいきませんでした。なぜなら、私はそれを見て、何者かがOutputStreamWriterに同様の問題を提案していたからです。 – Alexandre

答えて

1

あなたがOutputStreamWriterを使用してそれを書く場合ではない、特定の方法でフォーマットする必要があります。

私はあなたが読むために何かを書くためにwrite(string+"\n")を使用してreadLine()BufferedReaderBufferedWriterを使用することをお勧め。これを有効にするには、各メッセージの末尾に新しい行\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

コードの1行の例は必要ありません。想像上の問題を作り出さないでください。あなたが読む前にそれを洗い流してください。これは難しいことではありません。私は 'のために'の後の部分を理解できません。 – EJP

+0

私はサーバーにメッセージを送信した後にコードを実行するとNullPointerExceptionが発生し、クライアントにメッセージを送り返した直後にストリームをフラッシュすると例外エラーが発生します。 – Alexandre

関連する問題