2013-07-03 41 views
9

getOutputStreamメソッドを使用してstrinを送信するにはどうすればよいですか?彼らは言われたようにバイトを送ることができます。これまでのところ私はバイトを送ることができます。文字列値ではありません。Javaのソケット経由で文字列を送信する

public void sendToPort() throws IOException { 

    Socket socket = null; 
    try { 
     socket = new Socket("ip address", 4014); 
     socket.getOutputStream().write(2); // have to insert the string 
    } catch (UnknownHostException e) { 
     System.err.print(e); 
    } finally { 
     socket.close(); 
    } 

} 

事前

+0

文字列を送信するには、まず何らかのエンコード方式を使用して文字列をバイトに変換する必要があります。現在、UTF-8は事実上の標準です。 –

答えて

8

方法を行うことができます単純な文字列がある場合:

OutputStream outstream = socket .getOutputStream(); 
PrintWriter out = new PrintWriter(outstream); 

String toSend = "String to send"; 

out.print(toSend); 

EDITは:私自身の答えを発見し、改善が議論されました見ましたが、取り残さ。ここでOutputStreamWriterを使用して文字列を書くための良い方法は次のとおりです。

// Use encoding of your choice 
    Writer out = new BufferedWriter(new OutputStreamWriter(
     new FileOutputStream(fileDir), "UTF8")); 

    // append and flush in logical chunks 
    out.append(toSend).append("\n"); 
    out.append("appending more before flushing").append("\n"); 
    out.flush(); 
+2

ここでは、明示的なエンコードではなく、デフォルトのエンコードを使用していることに注意してください。これは危険です。 –

+1

PrintWriterはほとんど常に悪い考えです。それは例外を飲み込む方法は恐ろしいです。 –

+0

@JonSkeetええ、私は自分の提案したソリューションが本当に好きではありません。それがユーザーのために働くかどうかを見てみましょう。より良い解決策を考える。 –

3

つのオプションのおかげで:

を使用してバイトに文字列を変換し、 OutputStreamWriterでご OutputStreamをラップ

どちらの場合でもエンコードを明示的に指定する必要があります(例: "UTF-8" - プラットフォームのデフォルトエンコーディングを使用するのを避けます(これはほとんどの場合、悪い考えです)。

これは、文字列を送信する必要があり、もう一方の端がそれぞれの開始点と終了点を知る必要がある場合は、より複雑なプロトコルが必要になります。 Javaが両端にある場合は、DataInputStreamDataOutputStreamを使用できます。それ以外の場合は、独自のプロトコルを用意することができます(すでに固定されていないと仮定します)。

+0

THANKYOU VERY MUCH – Ravindu

+0

ええと、私はこのソケットとその入出力ストリームについて混乱しています。受信部はどうですか?私は、データ転送が単なる文字列/ファイルであるかどうかをどのように区別することができますか? @JonSkeet – gumuruh

+0

@ gumuruh:まったく別の質問のようです。この質問は文字列を送信することに関する*ちょっと*です。ファイルを送信することについては何もありません。それ以上の研究をする必要があるように思えます。そして、あなたがまだ混乱している場合は新しい質問をしてください。 –

3

あなたはPrintWriterを使っについて

socket.getOutputStream().write("your string".getBytes("US-ASCII")); // or UTF-8 or any other applicable encoding... 
1
public void sendToPort() throws IOException { 
    DataOutputStream dataOutputStream = null; 
    Socket socket = null; 
    try { 
     socket = new Socket("ip address", 4014); 
     dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
     dataOutputStream.writeUTF("2"); // have to insert the string 
    } catch (UnknownHostException e) { 
     System.err.print(e); 
    } finally { 
     if(socket != null) { 
      socket.close(); 
     } 
     if(dataOutputStream != null) { 
      dataOutputStream.close(); 
     } 
    } 
} 

注:あなたは、受信側からのDataInputStreamのreadUTF()メソッドを使用する必要があります。

注:「最後に」校正では、ヌルを確認する必要があります。それ以外の場合は、後でNullPointerExceptionを実行します。

+0

utfエンコーディングは標準のものではなく、変更されたものです。 –

3

あなたはこのようOutputStreamWriter使用することができます:あなたはこのような"UTF-8""UTF-16"として、文字セットを指定することもできます

OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream()); 
out.write("SomeString", 0, "SomeString".length); 

を......

OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream(), 
     "UTF-8"); 
out.write("SomeString", 0, "SomeString".length); 

またはPrintStream

PrintStream out = new PrintStream(socket.getOutputStream()); 
out.println("SomeString"); 

またはDataOutputStream

DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
out.writeBytes("SomeString"); 
out.writeChars("SomeString"); 
out.writeUTF("SomeString"); 

それとも

java.ioパッケージでWriter sおよびOutputStreamの詳細を見つけることができます

12

使用OutputStreamWriterクラスは、

public void sendToPort() throws IOException { 
    Socket socket = null; 
    OutputStreamWriter osw; 
    String str = "Hello World"; 
    try { 
     socket = new Socket("ip address", 4014); 
     osw =new OutputStreamWriter(socket.getOutputStream(), "UTF-8"); 
     osw.write(str, 0, str.length()); 
    } catch (IOException e) { 
     System.err.print(e); 
    } catch (UnknownHostException e) { 
     System.err.print(e); 
    } finally { 
     socket.close(); 
    } 

} 
+6

stackoverflowの恐ろしい6文字の編集量ポリシーのため、ここでは「UTF-8」は「UTF-8」であるとコメントしなければなりません。覚えておいてください。一重引用符は文字のためのものですが、二重引用符は文字列のためのものです。 – Richard

0

古い投稿を望むものを達成するために、私はポストのほとんどで同じ欠陥を見ることができます。ソケットを閉じる前に、ストリームをフラッシュしてください。 @ Josnidhinの答えのように:

public void sendToPort() throws IOException { 
    Socket socket = null; 
    OutputStreamWriter osw; 
    String str = "Hello World"; 
    try { 
     socket = new Socket("ip address", 4014); 
     osw =new OutputStreamWriter(socket.getOutputStream(), 'UTF-8'); 
     osw.write(str, 0, str.length()); 
     osw.flush(); 
    } catch (IOException e) { 
     System.err.print(e); 
    } finally { 
     socket.close(); 
    } 

} 
1

私はこの記事で非常に有効な解決策の束を参照してください。 IOUtils.write("Your String", socket.getOutputStream(), "UTF-8") し、適切な例外をキャッチ:

IOUtils.write(CharSequence, OutputStream, Charset)

は、基本的には、たとえばやって:私のお気に入りは、書き込み動作を行うためにはApache Commonsのを使用しています。何らかのプロトコルを構築しようとしているなら、いくつかのヒントのためにApache commons-netライブラリを調べることができます。

あなたはそれで間違って行くことはできません。そしてApache Commons-ioには他にも多くの便利なメソッドとクラスがあり、時間を節約できます。

関連する問題