Java - 通过TCP发送字符串或段落

时间:2012-12-05 00:48:04

标签: java string socket.io

我是Java的新手,我正在学习如何通过Socket()类发送消息。

我正在尝试围绕两个简单的聊天程序之间如何发送和接收字符串。我在网上找到了很多关于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()之后,发送多行文本的方法是什么?

3 个答案:

答案 0 :(得分:3)

在“有点不确定的部分”中使用套接字中的OutputStream创建PrintWriter, 然后打印消息,在文本区域的“mess”字符串上调用PrintWriter的print方法。

这会将消息字符串放在输出流缓冲区中,但在调用PrintWriters flush方法之前不会发送。

最后关闭PrintWriter。

当你按下回车键时,文本应该是多线的,因为textareas字符串将包含“\ r \ n”。

例如

PrintWriter output = new PrintWriter(skt.getOutputStream());
output.print(mess);
output.flush();
output.close();

答案 1 :(得分:2)

连接套接字并获得其输出流(通过socket.getOutputStream())后,写入套接字与写入任何输出流(例如文件)完全不同。您应该以与将其写入文件完全相同的方式编写多行文本。

如何发送多行文本 - 似乎最好的方法是在socket的输出流之上构造一个ObjectOutputStream,然后使用它。例如:

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

然后编写您的对象(字符串,字符串数组或List或其他):

oos.writeObject(mess);

只要mess的类是Serializable(如果mess是对象的集合,并且这些对象也是Serializable),这将有效。您可以使用ObjectInputStreamreadObject来阅读另一端的对象。

答案 2 :(得分:1)

有几种方法可以写入数据。例如,我喜欢序列化一个Class并通过ObjectOutputStream发送该类的实例。但由于您只发送一个字符串,因此BufferedWriter可能更容易处理。

代码:

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

这并不比那更令人困惑,“\ r \ n”可以更方便地处理接收端的最后一行。