2

私はJavaを初めて使用し、Socket()クラスを介してメッセージを送信する方法を学んでいます。

2つの簡単なチャットプログラム間で文字列が送受信される方法について頭を悩ませようとしています。TCP / UDPチャットクライアントとチャットサーバーについて、オンラインでたくさんの例を見つけました。

しかし、私はまだバッファリングされたデータと文字列と混同しています。

私のコードでは、3つのフィールド(field1、field2、area)と、イベントリスナーを含む送信ボタンを追加しました。以下はコードの一部であり、リスナーとそれがインスタンス化するクラスをどのようにアタッチしたかを示しています。

......more code above this

button.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
     new SendRequest();
   }
});


public class SendRequest{

  SendRequest(){

   try{

      String dip = field1.getText(); // ip address
      String port = field2.getText(); // port num
      int pnum = Integer.parseInt(port);
      String mess = area.getText(); // large text box
      Socket skt = new Socket(dip, pnum);

      /* kinda not sure about this part, with strings */


   }
   catch(IOException io){
      System.out.println("error? " + io.getMessage());
   }
  }
}

私はオンラインで非常に多くの例を見てきましたが、今は少し混乱しています。

新しいSocket()をインスタンス化した後、複数行のテキストを送信するための適切な方法は何ですか?

4

3 に答える 3

3

「ちょっとわからない部分」で、ソケットからOutputStreamを使用してPrintWriterを作成し、メッセージを印刷するには、テキスト領域から「mess」文字列でPrintWriterの印刷メソッドを呼び出します。

これにより、メッセージ文字列が出力ストリーム バッファーに置かれますが、PrintWriters フラッシュ メソッドを呼び出すまで送信されません。

最後に PrintWriter を閉じます。

Enter キーを押すと、textareas 文字列に「\r\n」が含まれるため、テキストは複数行で送信する必要があります。

例えば。

PrintWriter output = new PrintWriter(skt.getOutputStream());
output.print(mess);
output.flush();
output.close();
于 2012-12-05T01:16:28.940 に答える
2

ソケットが接続され、その出力ストリームを ( 経由でsocket.getOutputStream()) 取得すると、ソケットへの書き込みは、ファイルなどの出力ストリームへの書き込みとまったく変わりません。複数行のテキストは、ファイルに書き込む場合とまったく同じ方法で記述する必要があります。

複数行のテキストを送信する方法 —ObjectOutputStreamソケットの出力ストリームの上に を構築し、それを使用するのが最善の方法のようです。例えば:

Socket socket = new Socket(...);
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);

次に、オブジェクト (文字列、文字列の配列、またはListその他)を記述します。

oos.writeObject(mess);

messのクラスが である限りSerializable(およびmessがオブジェクトのコレクションであり、それらのオブジェクトも である場合Serializable)、これは機能します。ObjectInputStreamとを使用して、反対側からオブジェクトを読み取ることができますreadObject

于 2012-12-05T01:14:08.693 に答える
1

データの書き込み方法はいくつかあります。たとえば、クラスをシリアル化し、そのクラスのインスタンスを ObjectOutputStream 経由で送信するのが好きです。ただし、文字列のみを送信しているため、BufferedWriter の方が扱いやすい場合があります。

コード:

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(skt.getOutputStream(),"UTF-8")); //optional encoding
writer.write(mess+"\r\n");

「\r\n」は、受信側で最後の行を簡単に処理するためにあります。

于 2012-12-05T01:15:54.787 に答える