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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王_强 中级黑马   /  2013-3-27 13:10  /  1786 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.nets;
import java.io.*;
import java.net.*;
/*
* 需求:建立一个文本转换服务器
*  客户端给服务端发送文本,服务端会将文本转换成大写再返回给客户端
*  而且客户端可以不断的进行文本转换,当客户端输入over时,就接收
*
* 分析:
* 客户端:
* 既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作来思考
* 源:键盘录入
* 目的:网络设备,网络输出流
* 而且操作的是文本数据,可以选择字符流。
*
* 步骤:
* 1.建立服务
* 2.获取键盘录入
* 3.将数据发给服务端
* 4.获取服务端返回的大写数据
* 5.结束,关闭资源
*
* 都是文本数据可以使用字符流进行操作,同时提高效率,加入缓冲
*
* */

public class TcpClient2 {

        /**
         * @param args
         * @throws IOException
         * @throws UnknownHostException
         */
        public static void main(String[] args) throws Exception, IOException {
       
        Socket s=new Socket(InetAddress.getLocalHost(),10010);
  
        //定义读取键盘数据的流对象
        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
       
        //定义目的,将数据写入到socket输入流,发给服务端
        BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
       
        //定义一个Socket读取流,读取服务端返回的信息
        BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
       
        String line =null;
        //注意:readLine方法
        while((line=bufr.readLine())!=null){
               
                bufOut.write(line);
                bufOut.newLine();
                //一定要记得刷新
                bufOut.flush();
               
                if("over".equals(line))
                        break;
               
                String str=bufIn.readLine();
                System.out.println("server:"+str);
        }
       
        bufr.close();
        s.close();
       
        }

}

package com.nets;
import java.io.*;
import java.net.*;
/*
* 服务端:
* 源:socket读取流
* 目的:socket输出流
* 都是文本,装饰
*
* 该例子出现的问题:
* 现象:客户端和服务端都在莫名的的等待
*  为什么呢?
*  因为客户端和服务端都有堵塞式方法,这些方法都没有结束标记。
*  而导致两端都在等待
* */
public class TcpServer2 {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws Exception {
               
                ServerSocket ss=new ServerSocket(10010);
               
                Socket s=ss.accept();
                String ip=s.getInetAddress().getHostAddress();
                System.out.println(ip+"****connected");
               
                //读取socket读取流中的数据。
                BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
               
                //目的。socket输出流,将大写数据写入到socket输出流,并发送给客户端
                BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                PrintWriter ps=new PrintWriter(s.getOutputStream(),true);
        String line=null;
        
        while((line=bufIn.readLine())!=null){
                //System.out.println("fuwuduan");
                ps.println(line);
                //bufOut.write(line.toUpperCase());
                //bufOut.newLine();
                //bufOut.flush();
        }
        s.close();
        ss.close();
        }

}

请问,为什么我的没有在服务端输出结果?

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-27 19:47

3 个回复

倒序浏览
回答:美女,你把客户端发过来的数据你又返还给它,能服务端都没朋打印啊。你认真看看你的目的是什么:  PrintWriter ps=new PrintWriter(s.getOutputStream(),true); 你把数据写回客户端了。改成:  PrintWriter ps=new PrintWriter(System.out,true); 就好了。

        BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                PrintWriter ps=new PrintWriter(s.getOutputStream(),true);
        String line=null;
        
        while((line=bufIn.readLine())!=null){
                //System.out.println("fuwuduan");
                ps.println(line);
                //bufOut.write(line.toUpperCase());
                //bufOut.newLine();
                //bufOut.flush();
        }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
问题是出在服务器端while循环  代码块内:  ps.println(line);
楼主应该是没有明白对象ps的定义:PrintWriter ps=new PrintWriter(s.getOutputStream(),true);
这调用了l类Printwriter的构造方法:PrintWriter(OutputStream out, boolean autoFlush)
1.autoFlush即自动刷新,如果定义为true,则对象ps具有自动刷新功能,不用像对象bufOut,还得手动写bufOut.flush();来刷新了。
2.前一个参数是一个输出流对象,即该对象的所有功能都封装到了对象ps中,本例中将网络输出流对象s.getOutputStream()封装到了ps中,所以ps能将
服务端的数据通过管道发送客户端。 而ps.println(line)的意思是将line中的内容打印到网络输出流,传到客户端去,相当于bufOut.write().
3.本例中调用的ps对象的成员函数void println(Stirng s)在打印的同时还具有自动换行的功能,所以可以不用像bufOut对象还得写bufOut.newLine().

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马