在看到本文之前,如果读者没看过笔者的前文Java实现Socket网络编程(二) ,请先翻阅。
下面,我们来实现服务器接收子线程:
// 信息接收流
BufferedReader brIn = null;
// 使用"GBK"编码读取中文
brIn = new BufferedReader(new InputStreamReader(
mSocket.getInputStream(), "GBK"));
for (int c = brIn.read(); c != -1; c = brIn.read()) {
ServerMain.jtaReceivedMessage.append((char) c + "");
// 滚动到底端
ServerMain.jtaReceivedMessage
.setCaretPosition(ServerMain.jtaReceivedMessage
.getText().length());
}
Java输入输出,要采用流的方式,即InputStream和OutputStream,笔者采用了”GBK“编码读取中文,当然也可以采用”UTF-8“编码,在读取信息过程中,边读取边把内容添加到可视区域(服务器接收框),并使接收框自动滚动,滑动到最新的数据显示位置。
值得注意的是,这个for循环是一个死循环,除非发生读写错误被捕获到(Catch IOException),否则循环不能结束。因此,不能把”接收到的信息添加到可视区域“这个步骤放置到for循环外,否则会导致”怎么读取不到数据“这样的问题而开发者又无法察觉。如果要控制显示格式,也要在for循环内进行或对接收数据本身进行处理。
接下来,我们实现服务器向客户端”say hello“
OutputStreamWriter outstream = null;
// 将信息发送给客户端
try {
outstream = new OutputStreamWriter(
clientSocket.getOutputStream(), "GBK");
outstream.write(message);
outstream.flush();
} catch (IOException e1) {
if (outstream != null)
outstream.close();
e1.printStackTrace();
}
在读写过程中,要采用相同的编码,这里笔者同样采用”GBK“。使用OutputStream的flush()方法,这是为了避免使用缓冲区时,当输出的数据大小小于缓冲区大小时,系统不会进行”等缓冲区满再发送数据“的操作,而是直接把缓冲区的数据发送出去,避免客户端有”数据接收延时“的感觉。
在实现完服务器后,客户端也同样要建立接收信息的线程,并向服务器”say hello!“,由于代码类似,此处笔者为了节省篇幅,就不粘贴代码。
网友评论