2

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

我在网上看到了很多例子,现在我有点困惑。

实例化 new Socket() 后,发送多行文本的好方法是什么?

4

3 回答 3

3

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

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

最后关闭 PrintWriter。

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

例如。

PrintWriter output = new PrintWriter(skt.getOutputStream());
output.print(mess);
output.flush();
output.close();
于 2012-12-05T01:16:28.940 回答
2

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

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

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

然后写你的对象(一个字符串,一个字符串数组,或者一个List,或者诸如此类):

oos.writeObject(mess);

只要 的类messSerializable(并且 ifmess是对象的集合,并且这些对象也是Serializable),这将起作用。您可以使用ObjectInputStream和从另一端读取对象readObject

于 2012-12-05T01:14:08.693 回答
1

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

代码:

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

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

于 2012-12-05T01:15:54.787 回答