zoukankan      html  css  js  c++  java
  • 关于TCP的字节流转字符流

    TCP客服端的接收中:

     1     public static void main(String[] args) throws IOException {
     2         ServerSocket ss = new ServerSocket(10000);
     3         Socket accept = ss.accept();
     4         InputStream inputStream = accept.getInputStream();
     5         int len;
     6 //        byte[]bytes=new byte[1024];
     7         while ((len = inputStream.read(/*bytes*/)) != -1) {//一个字节一个字节的读
     8 //            System.out.println(new String(bytes,0,len));
     9             System.out.println((char)len);//一个字节一个字节的打印,如果是英文字母则不会出现乱码的问题,但是如果是中文则会出现乱码的问题
    10         }
    11         inputStream.close();
    12         accept.close();
    13         ss.close();
    14 
    15 
    16     }

     中文乱码:

    如果客服端是英文的话:

     1     public static void main(String[] args) throws IOException {
     2         Socket socket = new Socket("127.0.0.1", 10000);
     3         String s = "Coder0927";
     4         OutputStream outputStream = socket.getOutputStream();
     5         outputStream.write(s.getBytes());
     6         outputStream.close();
     7         socket.close();
     8 
     9 
    10     }

    则服务器的运行结果是:

    并不会出现乱码,但是如果客户端发送的是中文时:

     1     public static void main(String[] args) throws IOException {
     2         Socket socket = new Socket("127.0.0.1", 10000);
     3         String s = "迎风少年";
     4         OutputStream outputStream = socket.getOutputStream();
     5         outputStream.write(s.getBytes());
     6         outputStream.close();
     7         socket.close();
     8 
     9 
    10     }

     运行结果就会出现乱码:

     解决办法一:

    如果服务器不是一个字节一个字节的读取就不会出现乱码的问题(先用一个byte[]数组装字节)

    代码如下:

     1     public static void main(String[] args) throws IOException {
     2         ServerSocket ss = new ServerSocket(10000);
     3         Socket accept = ss.accept();
     4         InputStream inputStream = accept.getInputStream();
     5         int len;
     6         byte[]bytes=new byte[1024];
     7         while ((len = inputStream.read(bytes)) != -1) {
     8             System.out.println(new String(bytes,0,len));
     9 
    10         }
    11         inputStream.close();
    12         accept.close();
    13         ss.close();
    14 
    15 
    16     }

    运行结果:

    解决方法二:

    将得到的字节流转换为字符流:

    代码如下:

     1     public static void main(String[] args) throws IOException {
     2         ServerSocket ss = new ServerSocket(10000);
     3         Socket accept = ss.accept();
     4 
     5        /* int len;
     6         byte[]bytes=new byte[1024];
     7         while ((len = inputStream.read(bytes)) != -1) {
     8             System.out.println(new String(bytes,0,len));
     9 
    10         }*/
    11         BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));//转换流
    12         String line;
    13         while ((line = br.readLine()) != null) {
    14             System.out.println(line);
    15 
    16 
    17         }
    18 
    19 
    20         br.close();
    21         accept.close();
    22         ss.close();
    23 
    24 
    25     }

    运行结果:

    迎风少年
  • 相关阅读:
    利用Powerdesigner16.5(64位)连接64位oracle 配置系统odbc驱动
    Commons BeanUtils 中对Map的操作
    java内存模型与线程
    类加载器详解
    虚拟机性能监控与故障处理工具
    ENode框架Conference案例分析系列之
    ENode框架Conference案例分析系列之
    225.优化路径选择
    224.CAD相关操作
    223.概率统计
  • 原文地址:https://www.cnblogs.com/ZYH-coder0927/p/13523019.html
Copyright © 2011-2022 走看看