解决方案 »

  1.   

    字符串在传输过程中,都是 byte,变成字符串的时候,一般有三种 utf16,utf8,gb2312 编码,一般都用后两种,最好是用utf8,全球通用。
      

  2.   

    在发送Socket的时候就指定编码,/**
     * 发送一个Socket通信消息
     * @param vo
     * @return
     */
    public static boolean sendSocket(SocketVo vo) {
    try {
    if (!pingServer(vo.getIp(), 2000)) {return false;}
    Socket socket = new Socket(vo.getIp(), vo.getPort());// 创建socket对象,指定服务器端地址和端口号
    OutputStream output = socket.getOutputStream();
    // 就在这里指定编码格式
    Writer writer = new OutputStreamWriter(output, CharEncoding.UTF_8);
    PrintWriter out = new PrintWriter(writer, true);// 获取 Client 端的输出流
    vo.setIp(null);vo.setPort(0);
    out.print(GsonUtils.toJson(vo));// 填充信息
    writer.flush();writer.close();
    out.flush();out.close();
    output.flush();output.close();
    socket.close();
    return true;
    } catch (Exception e) {
    log.error("发送Socket失败:" + e.getMessage());
    return false;
    }
    }
    在接收Socket的时候也按指定编码读取,不可能还会有乱码,
    String jsonStr = FileUtil.get().readFile(socket.getInputStream(), HTTP.UTF_8, 1, false);
    socket.close();/**
     * 读取输入流中的文本
     * @param input 输入流
     * @param encoding 编码格式(默认为UTF-8)
     * @param beginLine 从第几行开始读(默认从第1行开始)
     * @param isLine 读完一行是否写入换行符
     * @return String
     * @throws Exception
     */
    public String readFile(InputStream input, String encoding, int beginLine, boolean isLine) throws Exception {
    String result = "";beginLine = (beginLine <= 0 ? 1 : beginLine);
    encoding = (ToolUtil.get().isBlank(encoding) ? HTTP.UTF_8 : encoding);
    InputStreamReader read = new InputStreamReader(input, encoding);
    BufferedReader reader = new BufferedReader(read);
    String line;int i = 1;
    while ((line = reader.readLine()) != null) {
    if (i >= beginLine) {result += line + (isLine ? "\n" : "");}i++;
    }
    reader.close();read.close();input.close();
    return result;
    }