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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H._张_♂ 中级黑马   /  2014-3-19 18:31  /  1879 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我自己按照题目要求写了一个程序,实现服务器反转字符串发回来。我写完后在cmd里面运行,没有问题,为什么在eclipse上运行后会出现乱码?代码如下。
  1. import java.io.DataInputStream;
  2. import java.io.DataOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;

  8. /**
  9. ** 10、使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。
  10. * 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
  11. * * @param args */
  12. public class Test10_Server {

  13.         public static void main(String[] args) {
  14.                
  15.                 //定义一个逆序char[] nx, 定义一个顺序char[]sx。该数组用于后面反转
  16.                 char [] nx; char [] sx;
  17.                
  18.                 //声明I/O流
  19.                 InputStream in = null;
  20.                
  21.                 OutputStream out = null;
  22.                
  23.                 try{
  24.                        
  25.                         //创建一个服务器
  26.                         ServerSocket ss = new ServerSocket(8888);
  27.                        
  28.                         try{
  29.                                 boolean flag = true;
  30.                                 while(flag){
  31.                                        
  32.                                         //监听skt
  33.                                         Socket skt = ss.accept();
  34.                                        
  35.                                         //将in引用指向skt监听的输入流
  36.                                         in = skt.getInputStream();
  37.                                        
  38.                                         //将out引用指向skt监听的输出流
  39.                                         out = skt.getOutputStream();
  40.                                        
  41.                                         //在输入输出流外套接一个数据流
  42.                                         DataInputStream din = new DataInputStream(in);
  43.                                        
  44.                                         DataOutputStream dout = new DataOutputStream(out);
  45.                                        
  46.                                         //对din使用readUTF()方法,并把值赋给ssx
  47.                                         String ssx = din.readUTF();
  48.                                        
  49.                                         if(ssx.equals("exit")){
  50.                                                
  51.                                                 flag = false;
  52.                                         }
  53.                                        
  54.                                         //创建一个顺序char类型的数组,长度是ssx的长度
  55.                                         sx = new char[ssx.length()];
  56.                                        
  57.                                         //创建一个逆序char类型的数组,长度是ssx的长度
  58.                                         nx = new char[ssx.length()];
  59.                                        
  60.                                         //数组sx指向字符串ssx拆分后的数组
  61.                                         sx = ssx.toCharArray();
  62.                                        
  63.                                         //实现逆序功能
  64.                                         for(int i=0;i<sx.length;i++){
  65.                                                
  66.                                                 nx[i] = sx[(ssx.length()-i-1)];       
  67.                                                
  68.                                         }
  69.                                        
  70.                                         //字符串snx 是char的string值
  71.                                         String snx = String.valueOf(nx) ;
  72.                                        
  73.                                         //使用dout输出流(dataOutputStream)将字符逆序字符string写回去
  74.                                         dout.writeUTF(snx);
  75.                                        
  76.                                         //通道关闭
  77.                                         din.close();
  78.                                        
  79.                                         dout.close();
  80.                                        
  81.                                 }
  82.                                
  83.                                
  84.                                 //抓异常打印堆栈信息
  85.                         }catch(IOException e){
  86.                                
  87.                                 e.printStackTrace();
  88.                         }
  89.                        
  90.                 }catch(IOException e){
  91.                        
  92.                         e.printStackTrace();       
  93.                 }

  94.         }

  95. }
复制代码
  1. import java.io.BufferedReader;
  2. import java.io.DataInputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStream;
  8. import java.net.Socket;

  9. /**
  10. * 10、使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。
  11. * 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
  12. * @param args
  13. */
  14. public class Test10_Client {

  15.         public static void main(String[] args) {
  16.                
  17.                 //创建键盘标准输入流,对其使用bufferedreader包装
  18.                 BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
  19.                
  20.                 //创建I/O流
  21.                 InputStream is = null;
  22.                
  23.                 OutputStream os = null;
  24.                
  25.                 try{
  26.                         //初始化flag,是客服端在后面可以手动停止
  27.                         boolean flag = true;
  28.                        
  29.                         while(flag){
  30.                                
  31.                                 //将键盘输入流赋值字符串s
  32.                                 String s = sin.readLine();
  33.                                
  34.                                 //判断是否是结束
  35.                                 if (s.equals("exit")){
  36.                                        
  37.                                         flag = false;
  38.                                        
  39.                                 }
  40.                                
  41.                                 //创建连接服务端
  42.                                 Socket skt = new Socket("127.0.0.1",8888);
  43.                                
  44.                                 //让输入输出流的引用指向skt的输入输入通道
  45.                                 is = skt.getInputStream();
  46.                                
  47.                                 os = skt.getOutputStream();
  48.                                
  49.                                 //用data类对输入输出流进行包装
  50.                                 DataOutputStream out = new DataOutputStream(os);
  51.                                
  52.                                 DataInputStream in = new DataInputStream(is);
  53.                                
  54.                                 //输出字符串s到服务器
  55.                                 out.writeUTF(s);
  56.                                
  57.                                 //读取服务器发过来的信息
  58.                                 String nx = in.readUTF();
  59.                                
  60.                                 //客户端答应nx
  61.                                 System.out.println(nx);               
  62.                                
  63.                                 //关闭通道
  64.                                 out.close();
  65.                                 in.close();
  66.                         }       
  67.                         //捕获异常,打印堆栈信息
  68.                 }catch(IOException e){
  69.                        
  70.                         e.printStackTrace();       
  71.                        
  72.                 }
  73.         }

  74. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

5 个回复

倒序浏览
在dos命令行里你是可以开两个窗口的,在myeclipse里默认只有一个窗口,这是进行网络传输就要开两个控制台了你才能看到效果
回复 使用道具 举报
可能是你eclipse 环境编码设置的问题。试试window——preferences——workspace——改下编码
回复 使用道具 举报
张东健 发表于 2014-3-19 20:14
在dos命令行里你是可以开两个窗口的,在myeclipse里默认只有一个窗口,这是进行网络传输就要开两个控制台了 ...

那能不能在eclipse里面设置开两个窗口,分别运行呢?
回复 使用道具 举报
可以的 点击右下角的三角形,选择new console view 就会新开一个控制台

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
张东健 发表于 2014-3-19 21:40
可以的 点击右下角的三角形,选择new console view 就会新开一个控制台

果然是这样哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马