有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我是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) 个答案

  1. # 1 楼答案

    一旦连接套接字并获得其输出流(通过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从另一端读取对象

  2. # 2 楼答案

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

    代码:

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

    没有比这更令人困惑的了,“\r\n”用于更容易地处理接收端的最后一行

  3. # 3 楼答案

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

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

    最后关闭PrintWriter

    文本应以多行方式发送,因为按enter键时textareas字符串将包含“\r\n”

    例如

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