2013-07-03 4 views
9

Как я могу отправить strin с помощью метода getOutputStream. Он может отправлять только байты, как они упомянули. Пока я могу отправить байт. но не строковое значение.Отправить строку вместо байта через сокет в 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

Как об использовании PrintWriter:

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 почти всегда является плохой идеей IMO. То, как он проглатывает исключения, ужасно. –

+0

@ JonSkeet Да, мне действительно не нравится мое собственное предлагаемое решение. Посмотрим, работает ли он для пользователя. Думая о лучшем решении. –

3

Два варианта:

  • обернуть в OutputStreamWriterOutputStream, так что вы можете отправить строку
  • Преобразовать строку в байты, используя String.getBytes(encoding)

Обратите внимание, что в обоих случаях вы должен явно указывать кодировку, например. «UTF-8» - это позволяет избежать его просто используя стандартную кодировку платформы (что почти всегда плохое представление).

Это просто отправит персональные данные, хотя, если вам нужно отправить несколько строк, а другой конец должен знать, где каждый из них начинается и заканчивается, вам понадобится более сложный протокол. Если это Java на обоих концах, вы можете использовать DataInputStream и DataOutputStream; в противном случае вы можете захотеть придумать свой собственный протокол (при условии, что он еще не исправлен).

+0

THANKYOU ОЧЕНЬ МНОГО – Ravindu

+0

eh, .... Я не согласен с этим сокетом и его потоком ввода/вывода. Как насчет получающей части? Я имею в виду, как мы можем различать, является ли передача данных просто строкой/файлом? @JonSkeet – gumuruh

+0

@gumuruh: Это звучит как совсем другой вопрос. Этот вопрос * просто * о посылке строки - нет ничего о посылке файла. Похоже, вы должны сделать еще несколько исследований, а затем задать новый вопрос, если вы все еще смущены. –

3

, если у вас есть простая строка, которую вы можете сделать

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 метод() от принимающей стороны.

ПРИМЕЧАНИЕ: вы должны проверить значение null в «finally» caluse; иначе вы снова столкнетесь с NullPointerException.

+0

Обратите внимание, что кодировка utf не является стандартной, является модифицированной. –

3

Вы можете использовать OutputStreamWriter так:

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

Вы можете указать набор символов, таких как "UTF-8""UTF-16" ......

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

Или вы можете найти больше Writer s и s OutputStream в

java.io пакет

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.html, я должен здесь прокомментировать, что 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

В этом посте я вижу кучу очень действительных решений. Мой любимый использует Apache Commons, чтобы сделать операцию записи:

IOUtils.write(CharSequence, OutputStream, Charset)

в основном делают, например: IOUtils.write("Your String", socket.getOutputStream(), "UTF-8") и ловить соответствующие исключения. Если вы пытаетесь создать какой-то протокол, вы можете заглянуть в библиотеку Apache commons-net для некоторых советов.

Вы никогда не ошибетесь. И в Apache commons-io есть много других полезных методов и классов, которые сэкономят вам время.

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