美文网首页JAVA socket程序员Java学习笔记
Java实现Socket网络编程(三)

Java实现Socket网络编程(三)

作者: Louis_陆 | 来源:发表于2016-04-09 12:27 被阅读467次

    在看到本文之前,如果读者没看过笔者的前文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网络编程(三)

      本文链接:https://www.haomeiwen.com/subject/pnxblttx.html