2013-07-03 7 views
9

Jak wysłać wiadomość za pomocą metody getOutputStream. Może tylko wysyłać bajty, o czym wspomnieli. Do tej pory mogę wysłać bajt. ale nie wartość ciągu.Wyślij ciąg znaków zamiast bajtu przez gniazdo w Javie

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

} 

góry dzięki

+0

Aby wysłać ciąg znaków, należy go przekonwertować na bajty, używając najpierw schematu kodowania. UTF-8 jest obecnie standardem de facto. –

Odpowiedz

8

Jak na temat korzystania PrintWriter:

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

String toSend = "String to send"; 

out.print(toSend); 

EDIT: Znaleziono moje własne odpowiedzi i nastąpiła poprawa była omawiana, ale pominięta. Tutaj jest lepszym sposobem napisać ciągi przy użyciu 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

Zauważ, że używasz domyślnego kodowania zamiast jawnego, co jest niebezpieczne. –

+1

PrintWriter jest prawie zawsze złym pomysłem IMO. Sposób, w jaki połyka wyjątki, jest okropny. –

+0

@JonSkeet Tak, naprawdę nie lubię mojego własnego proponowanego rozwiązania. Zobaczmy, czy działa dla użytkownika. Myśląc o lepszym rozwiązaniu. –

3

dwie opcje:

Pamiętaj, że w obu przypadkach powinien jawnie określać kodowanie, np. "UTF-8" - unika się tego po prostu używając domyślnego kodowania platformy (co jest prawie zawsze złym pomysłem).

Spowoduje to tylko wysłanie samych danych znakowych - jeśli chcesz wysłać kilka ciągów, a drugi koniec musi wiedzieć, gdzie każdy się zaczyna i kończy, potrzebujesz bardziej skomplikowanego protokołu. Jeśli jest to Java na obu końcach, możesz użyć DataInputStream i DataOutputStream; w przeciwnym razie możesz wymyślić własny protokół (zakładając, że nie jest on już naprawiony).

+0

THANKYOU BARDZO DUŻE – Ravindu

+0

eh, .... nie mam pojęcia o tym gnieździe i jego strumieniu wejściowym/wyjściowym. A co z częścią odbiorczą? Chodzi mi o to, jak możemy rozróżnić, czy transfer danych to tylko ciąg/plik? @JonSkeet – gumuruh

+0

@gumuruh: To brzmi jak zupełnie inne pytanie. To pytanie brzmi * tylko * o wysłaniu ciągu znaków - nie ma nic o wysyłaniu pliku. Wygląda na to, że powinieneś zrobić więcej badań, a następnie zadać nowe pytanie, jeśli nadal jesteś zdezorientowany. –

3

jeśli masz prosty ciąg można zrobić

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

UWAGA: Trzeba będzie użyć DataInputStream readUTF metoda() od strony odbiorczej.

UWAGA: musisz sprawdzić wartość zerową w "końcu"; w przeciwnym razie pojawi się później w NullPointerException.

+0

Należy pamiętać, że kodowanie utf nie jest standardowym, jest zmodyfikowane. –

3

Można użyć OutputStreamWriter takiego:

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

Możesz określić zestaw znaków, takich jak "UTF-8""UTF-16" ......

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

Albo PrintStream:

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

Albo DataOutputStream:

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

Albo można znaleźć więcej Writer s i OutputStream s w

Pakiet java.io

12

Zastosowanie OutputStreamWriter klasa osiągnąć to, co chcesz

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

Ponieważ straszna polityka ilościowa 6 znaków stackoverflow, muszę tutaj skomentować, że "UTF-8" powinien być "UTF-8". Pamiętaj, że pojedyncze cudzysłowy są dla znaków, podczas gdy cudzysłowy są używane dla Ciągów. – Richard

0

stare posty, ale widzę tę samą wadę większość stanowisk. Przed zamknięciem gniazda przepłucz strumień. Podobnie jak w odpowiedzi @ Josnidhina:

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

Widzę kilka bardzo ważnych rozwiązań w tym poście. Moim ulubionym jest przy użyciu Apache Commons wykonać operację zapisu:

IOUtils.write(CharSequence, OutputStream, Charset)

zasadzie robi na przykład: IOUtils.write("Your String", socket.getOutputStream(), "UTF-8") i łapanie odpowiednich wyjątków. Jeśli próbujesz zbudować jakiś protokół, możesz zajrzeć do biblioteki sieciowej Apache dla niektórych wskazówek.

Z tym nie można się nigdy pomylić. A jest wiele innych przydatnych metod i klas w Apache - io, które zaoszczędzą twój czas.