我是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()之后,发送多行文本的方法是什么?
答案 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
),这将有效。您可以使用ObjectInputStream
和readObject
来阅读另一端的对象。
答案 2 :(得分:1)
有几种方法可以写入数据。例如,我喜欢序列化一个Class并通过ObjectOutputStream发送该类的实例。但由于您只发送一个字符串,因此BufferedWriter可能更容易处理。
代码:
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(skt.getOutputStream(),"UTF-8")); //optional encoding
writer.write(mess+"\r\n");
这并不比那更令人困惑,“\ r \ n”可以更方便地处理接收端的最后一行。