A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庄承荣 黑马帝   /  2011-11-20 20:33  /  2819 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是一段基于TCP的多客户登录代码,运行以下代码,在控制台输入中文会出现乱码问题,请大家帮忙看看是怎么回事。
  1. package javase.day18;

  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStreamWriter;
  6. import java.io.PrintWriter;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;

  9. public class MultiLogin {

  10.         public static void main(String[] args) {

  11.         }

  12. }

  13. class loginClient {
  14.         public static void main(String[] args )throws Exception{
  15.                 System.out.println("client start...");
  16.                 Socket clientSocket = new Socket("192.168.1.2",10011);
  17.                 BufferedReader consoleMsgReader = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
  18.                 BufferedReader socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));
  19.                 OutputStreamWriter osw = new OutputStreamWriter(clientSocket.getOutputStream(),"UTF-8");
  20.                 PrintWriter socketWriter = new PrintWriter(osw,true);
  21.                 String inputStr;
  22.                 for(int i=0 ; i<5 ; i++){
  23.                         System.out.print("please input your login name:");
  24.                         inputStr=consoleMsgReader.readLine();
  25.                         System.out.println("your input is :"+inputStr);
  26.                         if(inputStr==null){
  27.                                 break;
  28.                         }
  29.                         socketWriter.println(inputStr);
  30.                         String responseMsgFromServer=socketReader.readLine();
  31.                         System.out.println(responseMsgFromServer);
  32.                         if(responseMsgFromServer.indexOf("successful")!=-1){
  33.                                 break;
  34.                         }
  35.                 }
  36.         }
  37. }

  38. class loginServer{
  39.         public static void main(String[] args) throws Exception{
  40.                 System.out.println("server start...");
  41.                 ServerSocket ss = new ServerSocket(10011);
  42.                 Socket s = ss.accept();
  43.                 new Thread(new ServerThread(s)).start();
  44.                 ss.close();
  45.         }
  46. }

  47. class ServerThread implements Runnable{
  48.         private Socket s ;
  49.         public ServerThread(Socket s){
  50.                 this.s=s ;
  51.         }
  52.         public void run(){
  53.                 try{
  54.                         BufferedReader socketReader = new BufferedReader(new InputStreamReader(this.s.getInputStream(),"UTF-8"));
  55.                         OutputStreamWriter osw = new OutputStreamWriter(this.s.getOutputStream(),"UTF-8");
  56.                         PrintWriter socketWriter = new PrintWriter(osw,true);
  57.                         String name;
  58.                         while((name = socketReader.readLine())!=null){
  59.                                 System.out.println("name from client:"+name);
  60.                                 BufferedReader userRecords = new BufferedReader(new FileReader("C:\\java_test\\user.txt"));
  61.                                 String line=null;
  62.                                 boolean flag = false;
  63.                                 while((line=userRecords.readLine())!=null){       
  64.                                         if(line.equals(name)){
  65.                                                 flag=true;
  66.                                                 break;
  67.                                         }
  68.                                 }
  69.                                 if(flag){
  70.                                         System.out.println(name+"已登录");
  71.                                         socketWriter.println("Login successful ! welcome to here , "+name);
  72.                                 }else{
  73.                                         socketWriter.println("Login failed , 用户名\""+name+"\"不存在,请重新输入");
  74.                                 }
  75.                         }
  76.                        
  77.                         //this.s.close();
  78.                 }catch(Exception e){
  79.                         e.printStackTrace();
  80.                 }
  81.                
  82.                
  83.         }
  84.        

  85. }
复制代码
下面是控制台输出信息:
client start...
please input your login name:好好好
your input is :好好�?
Login failed , 用户名"好好�?"不存在,请重新输入
please input your login name:测试一下
your input is :测试�?��
Login failed , 用户名"测试�?��"不存在,请重新输入
please input your login name:哈哈哈哈哈哈哈
your input is :哈哈哈哈哈哈�?
Login failed , 用户名"哈哈哈哈哈哈�?"不存在,请重新输入
please input your login name:哈
your input is :�?
Login failed , 用户名"�?"不存在,请重新输入
please input your login name:never give up
your input is :never give up
Login failed , 用户名"never give up"不存在,请重新输入

评分

参与人数 1技术分 +1 黑马币 +1 收起 理由
黑马谢承强 + 1 + 1 很给力!看看是不是编码的问题,或者输入法.

查看全部评分

2 个回复

倒序浏览
编码问题呢。把程序内编码UTF-8改成GBK
回复 使用道具 举报
其实乱码产生原因就是GBK转UTF-8,而这两种方式针对中文字符的编码以及解码都是不同的。
我在控制台输入的文字应该是GBK(我想是因为输入法的原因),而由于我的MyEclipse所有的编码设置全都是UTF-8,包括控制台的编码读取方式也是UTF-8,也就是源头和尽头是两种不同的编码方式,因此会造成乱码问题。
我暂时所知道的,可能也是唯一的解决方法就是将MyEclipse的环境设为GBK,这样试过是可行的。但由于我原先的文件都是以UTF-8的方式保存的,改成GBK意味着需要重写代码。因此,最好是能有方法能够将在代码层次将GBK转为UTF-8,但上网查了很多资料,还没找到有效方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马