繁体   English   中英

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

[英]Java - Sending a String or paragraph via TCP

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

我试图围绕两个简单的聊天程序之间字符串的发送和接收方式进行思考。 我在网上找到了很多关于TCP / UDP聊天客户端和聊天服务器的示例。

但是我仍然对缓冲的数据和字符串感到困惑。

在我的代码中,我添加了3个字段(field1,field2,area)和带有事件侦听器的Submit按钮。 下面是代码的一部分,显示了我如何附加侦听器及其实例化的类。

......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()之后,发送多行文本的一种不错的方法是什么?

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

这会将消息字符串放入输出流缓冲区中,但是直到您调用PrintWriters flush方法后才发送消息字符串。

最后关闭PrintWriter。

文本应该以多行发送,因为当您按Enter键时,textareas字符串将包含“ \\ r \\ n”。

例如。

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

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

如何发送多行文本-似乎最好的方法是在套接字的输出流顶部构造一个ObjectOutputStream并使用它。 例如:

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

然后编写您的对象(字符串,字符串数组或List ,或诸如此类):

oos.writeObject(mess);

只要mess的类别是可Serializable (并且如果mess是对象的集合,并且那些对象也是可以Serializable ),这将起作用。 您可以使用ObjectInputStreamreadObject从另一端读取对象。

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

码:

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

没什么比这更令人困惑的了,“ \\ r \\ n”可以方便地在接收端处理最后一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM