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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王德升 中级黑马   /  2012-7-21 16:16  /  1285 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

class  TransClient
{
        public static void main(String[] args) throws Exception
        {
                Socket s = new Socket("193.133.1.253",999);

                BufferedReader bufr =
                        new BufferedReader(new InputStreamReader(System.in));

                //BufferedWriter bufOut =
                        //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

                PrintWriter out = new PrintWriter(s.getOutputStream(),true);//上面那步怎么演变成这一步了?

                BufferedReader bufIn =
                        new BufferedReader(new InputStreamReader(s.getInputStream()));//为什么要用s调用getInputStream呢 ?

                String line = null;
               
                while((line=bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;

                        String str =bufIn.readLine();

                        System.out.println("server:"+str);
                       
                }

                bufr.close();
                s.close();


        }
}


第二段。
import java.net.*;

class  UdpSend
{
        public static void main(String[] args) throws Exception
        {
                DatagramSocket ds = new DatagramSocket(3333);

                byte[] buf = "udp ge men lai le ".getBytes();

                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("193.133.1.253"),33333);

                ds.send(dp);

                ds.close();
        }
}
//这个文件老师存的时候是UdpDemo.java,编译时是UdpDemo.java,可是运行时怎么用UdpSend();不懂???

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

3 个回复

正序浏览

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

class  TransClient
{
        public static void main(String[] args) throws Exception
        {
                Socket s = new Socket("193.133.1.253",999);

                BufferedReader bufr =
                        new BufferedReader(new InputStreamReader(System.in));

                //BufferedWriter bufOut =
                        //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

                PrintWriter out = new PrintWriter(s.getOutputStream(),true);//上面那步怎么演变成这一步了?
                //这地方是这样的:将s.getOutputStream()得到的输出流用PrintWriter独享输出,true的意思是说刷新缓冲区,写一点刷新一点
                BufferedReader bufIn =
                        new BufferedReader(new InputStreamReader(s.getInputStream()));//为什么要用s调用getInputStream呢 ?
s是表示的是客户端,里面封装这InputStream和OutPutStream两个流对象,服务器可以通过客户端的刘对象获取里面的InputStream和OutPutStream,然后用客户端的InputStream和OutPutStream进行相应的解析
                s.getInputStream():获取InputStream对象然后进行读取操作


                String line = null;
               
                while((line=bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;

                        String str =bufIn.readLine();

                        System.out.println("server:"+str);
                        
                }

                bufr.close();
                s.close();


        }
}


第二段。
import java.net.*;

class  UdpSend
{
        public static void main(String[] args) throws Exception
        {
                DatagramSocket ds = new DatagramSocket(3333);

                byte[] buf = "udp ge men lai le ".getBytes();

                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("193.133.1.253"),33333);

                ds.send(dp);

                ds.close();
        }
}
//这个文件老师存的时候是UdpDemo.java,编译时是UdpDemo.java,可是运行时怎么用UdpSend();不懂???
因为下面的是服务端,要把服务端开启客户端客户端才可以访问服务端,并返回要给客户端的数据

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张雪磊 于 2012-7-21 17:48 编辑

补充楼上的
//这个文件老师存的时候是UdpDemo.java,编译时是UdpDemo.java,可是运行时怎么用UdpSend();不懂???

一个java文件里可以写很多个类(class),编译就是把java文件里的类编译成java虚拟机可加载运行的class文件,而你在这个java文件中写每一个类都被编译成一个独立的class文件。首先编译的时候需要找到这个java源文件,所以需要用java源文件的名字来编译就是 在命令提示符里输出“javac UdpDemo.java”编译。编译成功后会对应生成多个类文件(对于这个程序会生成2两个类文件 TransClient .class和 UdpSend.class )。而运行的时候需要找到有主方法的类文件,由于这个程序两个类都有自己的主方法都可以独立运行,所以运行时用“java UdpSend”命令就是运行UdpSend.class这个class文件,用“java  TransClient ”就是运行 TransClient.class这个文件。所以编译的时候看java源文件名,运行的时候看生成的class文件名。由于之前老师写的大多数都是只有一个主方法的程序,java文件名跟生成的可独立运行的类文件名相同,让楼主有点误解。
回复 使用道具 举报
mport java.io.*;
import java.net.*;

class  TransClient
{
        public static void main(String[] args) throws Exception
        {
                Socket s = new Socket("193.133.1.253",999);

                BufferedReader bufr =
                        new BufferedReader(new InputStreamReader(System.in));

                //BufferedWriter bufOut =
                        //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

                PrintWriter out = new PrintWriter(s.getOutputStream(),true);//上面那步怎么演变成这一步了?

                BufferedReader bufIn =
                        new BufferedReader(new InputStreamReader(s.getInputStream()));//为什么要用s调用getInputStream呢 ?

                String line = null;
               
                while((line=bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;

                        String str =bufIn.readLine();

                        System.out.println("server:"+str);
                        
                }

                bufr.close();
                s.close();


        }
}


第二段。
import java.net.*;

class  UdpSend
{
        public static void main(String[] args) throws Exception
        {
                DatagramSocket ds = new DatagramSocket(3333);

                byte[] buf = "udp ge men lai le ".getBytes();

                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("193.133.1.253"),33333);

                ds.send(dp);

                ds.close();
        }
}
//这个文件老师存的时候是UdpDemo.java,编译时是UdpDemo.java,可是运行时怎么用UdpSend();不懂???


1:  //BufferedWriter bufOut =
                        //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);//上面那步怎么演变成这一步了?

       ① PrintWriter:向文本输出流打印对象的格式化表示形式,它的底层是个PrintStream,也就是字节流所有可以接收
OutputStream,就是说它能自动把字符流转换成字节流
    ②而BufferddWriter,底层还是一个字符流,无法将字符流转换成字节流,所以需要OutputStreamWriter转换
    ③PrintWriter是java平台为我们提供的一个非常好的格式化输出类,非常方便,所以老师就用现成的好东西了,哈哈,
何必非要自己动手做?

  2、 BufferedReader bufIn =
                        new BufferedReader(new InputStreamReader(s.getInputStream()));//为什么要用s调用getInputStream呢 ?


    ①这里的s值的是一个Socket,Socket其实内部包装了一个InputStream和一个outputStream,用于下载和上传。
②  当你要下载数据时,就到InputStream流里面读取就可以了。
当你要上传数据时,就把数据写入OutputStream流中了
③如果把Socket比作一条网线,那么InputStream就是其中的下载线,而OutputStream就是上传线了。

④网络上面的数据其实都包装在一个Socket里面了,你可以通过Socket读数据,写数据等等。





评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

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