Java实现Socket网络编程(三)

在看到本文之前,如果读者没看过笔者的前文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!“,由于代码类似,此处笔者为了节省篇幅,就不粘贴代码。

你可能感兴趣的:(Java实现Socket网络编程(三))