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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张华廷 于 2012-6-23 09:52 编辑

import java.io.*;
import java.net.*;


class TransClicet {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                Socket s=new Socket("192.168.1.107",10005);
               
                //定义读取键盘数据的 数据流
                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;
                while((line=bufr.readLine())!=null)
                {
                        bufOut.write(line);
                        if ("over".equals(line))
                                break;
                        
                        bufOut.write(line);
                        bufOut.newLine();
                        bufOut.flush();
                        、、刷新后缓冲区的数据出去
                        String str=bufIn.readLine();
                        System.out.println("server"+str);
                        
                }
               
                bufr.close();
                s.close();

        }

}


class TransServer
{
         public static void main (String[] args) throws IOException
         {
                 ServerSocket ss= new ServerSocket(10005);
                  
                 Socket s=ss.accept();
                 String ip =s.getInetAddress().getHostAddress();
                 System.out.print(ip+"......connectted");
                 
                 //读取socket读取流中的数据
                 BufferedReader bufIn=new BufferedReader (new InputStreamReader(s.getInputStream()));
                 
                //将大写数据写入socket输出流。并发给客户端
                 BufferedWriter bufOut =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                 
                String line =null;
                 
                 while ((line=bufIn.readLine())!=null)//阻塞式方法读到数据,没有返回数据,什么时候返回数据?
                 
                 {
                         System.out.println(line);
                         bufOut.write(line.toUpperCase());
                         bufOut.newLine();
                         bufOut.flush();
                        
                        
                 }
                 
                 s.close();
                 
                 ss.close();
               
         }
         

}

阻塞式方法读到数据,没有返回数据,什么时候返回数据?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 周兴中 于 2012-6-23 01:57 编辑

import java.io.*;
import java.net.*;


class TransClicet {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                Socket s=new Socket("192.168.1.107",10005);
               
                //定义读取键盘数据的 数据流
                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;
                while((line=bufr.readLine())!=null)
                {
                        bufOut.write(line);//此处你应该是多写了一行,这样的话你这程序向服务端每写了一行数据中包含了两段相同的来自键盘的数据.
                        if ("over".equals(line))
                                break;
                        
                        bufOut.write(line);
                        bufOut.newLine();//如果不加这句话,服务器的readLine()方法将会一直处于等待状态.在等待回车符
                        bufOut.flush();如果不刷新缓冲区,服务器端将收不到数据.
                        //刷新后缓冲区的数据出去
                        String str=bufIn.readLine();
                        System.out.println("server"+str);
                        
                }
               
                bufr.close();
                s.close();

        }

}


class TransServer
{
         public static void main (String[] args) throws IOException
         {
                 ServerSocket ss= new ServerSocket(10005);
                  
                 Socket s=ss.accept();
                 String ip =s.getInetAddress().getHostAddress();
                 System.out.print(ip+"......connectted");
                 
                 //读取socket读取流中的数据
                 BufferedReader bufIn=new BufferedReader (new InputStreamReader(s.getInputStream()));
                 
                //将大写数据写入socket输出流。并发给客户端
                 BufferedWriter bufOut =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                 
                String line =null;
                 
                 while ((line=bufIn.readLine())!=null)//阻塞式方法readLine()当读到输出流的回车符时才返回数据,所以输出流中要记得使用newLine()方法(跨平台的方法),并且要注意刷新缓冲区,既flush().如果用PrintWriter打印流的话,就会简便很多,可以标记自动刷新,println()自动添加回车符在每行数据末尾处.                 
                 {
                         System.out.println(line);
                         bufOut.write(line.toUpperCase());
                         bufOut.newLine();
                         bufOut.flush();
                        
                        
                 }
                 
                 s.close();
                 
                 ss.close();
               
         }
         

}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
/*楼主你问的是服务器什么时候返回的数据?
我想你的意思是不是客户端和服务端他们之间数据是怎么进行相互进行交流的是吧;
我开始的时候也和你有一的疑问:它们之间分别他创建了自己的读取流和输出流;
怎么就可以让自己的读取流读取到对方的数据呢?
答案其实很简单:
在听毕老师的课的时候你可能有一句话没有听到;
服务端的Socket s=ss.accept()方法是在获取一个客户端对象;
而这时的Socket s这个对象和服务端的Socket 是同一个对象;
它们之间操作的流对象都是同个客户端的流对象;也就是不管是客户端的读取流和输出流;
还是服务端的读取流和输出流它们都是属于客户端的;也就他们操作的都是同一个流对象;
总结 他们之间其实不存在什么返回不返回的问题;那只是一个两个地址之间数据传输的形象说法;
取流读的数据都是从它的输出流里读出来的;只不过读取流和输出流之间的关系是封装在Socket对象内部的,
因为服务端使用accept()获取到了客户端的对象(具体是哪个对象是通过IP地址和端口来确定的)并调用了它的流方法;
因此完成了数据的交互;
希望这样说你能听的懂;
*/
import java.io.*;
import java.net.*;

class TransClicet {

        /**
          * @param args
          * @throws IOException
         */
         public static void main(String[] args) throws IOException {
                 // TODO Auto-generated method stub
                 Socket s=new Socket("192.168.1.100",10005);
                 
                //定义读取键盘数据的 数据流
                 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;
                 while((line=bufr.readLine())!=null)
                 {
                         //bufOut.write(line);
                         if ("over".equals(line))
                                 break;
                        
                        bufOut.write(line);
                         bufOut.newLine();
                         bufOut.flush();
      //刷新后缓冲区的数据出去
                         String str=bufIn.readLine();
                         System.out.println("server"+str);
                        
                }
                 
                bufr.close();
                 s.close();

        }

}

class TransServer
{
          public static void main (String[] args) throws IOException
          {
                  ServerSocket ss= new ServerSocket(10005);
                  
                  Socket s=ss.accept();
                  String ip =s.getInetAddress().getHostAddress();
                  System.out.println(ip+"......connectted");
                  
                  //读取socket读取流中的数据
                  BufferedReader bufIn=new BufferedReader (new InputStreamReader(s.getInputStream()));
                  
                 //将大写数据写入socket输出流。并发给客户端
                  BufferedWriter bufOut =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                  
                 String line =null;
                  
                  while ((line=bufIn.readLine())!=null)//阻塞式方法读到数据,没有返回数据,什么时候返回数据?
                  
                  {
                          System.out.println(line);
                          bufOut.write(line.toUpperCase());
                          bufOut.newLine();
                          bufOut.flush();
                          
                          
                  }
                  
                  s.close();
                  
                  ss.close();
                 
         }
         

}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class TransClicet {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                Socket s=new Socket("192.168.1.107",10005);
               
                //定义读取键盘数据的 数据流
                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;
                while((line=bufr.readLine())!=null)
                {
                        if ("over".equals(line))
                                break;                  
                        bufOut.write(line);
                        bufOut.newLine();
                        bufOut.flush();//刷新后缓冲区的数据出去
                        String str=bufIn.readLine();
                        System.out.println("server"+str);
                        
                }
               
                bufr.close();
                s.close();

        }

}


class TransServer
{
         public static void main (String[] args) throws IOException
         {
                 ServerSocket ss= new ServerSocket(10005);
                  
                 Socket s=ss.accept();
                 String ip =s.getInetAddress().getHostAddress();
                 System.out.print(ip+"......connectted");
                 
                 //读取socket读取流中的数据
                 BufferedReader bufIn=new BufferedReader (new InputStreamReader(s.getInputStream()));
                 
                //将大写数据写入socket输出流。并发给客户端
                 BufferedWriter bufOut =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));//这里可以使用PrintWriter=new PrintWriter(s.getOutputStream() ,true),因为PrintWriter不仅可以接收字节流,也可以接收字符流,可以自动刷新,使用起来非常方便!
                 
                String line =null;
                 
                 while ((line=bufIn.readLine())!=null)//阻塞式方法读到数据,没有返回数据,什么时候返回数据? readLine()方法是阻塞式方法,它遇到结束标志即回车符才会停止。
                 
                 {
                         System.out.println(line);
                         bufOut.write(line.toUpperCase());
                         bufOut.newLine();
                         bufOut.flush();                                            
                 }               
                 s.close();               
                 ss.close();              
         }
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
讲的都非常详细,谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马