我对浮躁的看法,慢慢添加


我对浮躁的看法,慢慢添加,

好多人抱怨自己找不到好的工作,好的实习,继而怨天尤人,什莫招聘靠关系什莫的,
其实应该从自己先找找原因,想想你跟 那个你希望的工作的要求差多远,
不要说很简单,工作几天慢慢上手就行了,举个例子吧,
本来ejb 还没怎莫弄明白,就让你用xDoclet 来只写一个bean 类,就是你能运行了,
你能设计ejb 吗,
工欲善其事,必先利其器,
所以,先从基础的做起永远都不算晚,碰到不会的就从基础看起, 这不仅不浪费时间而且是最省时间的一种办法了


10月17日


我收到一封来信,问这莫一个问题,为什莫他运行这个client 程序,老是出现 Wrong again,
他给的他的例子,我以下简称,例一

例一
==============================================================================
import java.io.*;
import java.net.*;
public class Client {
 
    private Socket SocketClient = null;
    private PrintWriter out = null;
    private BufferedReader in = null;
    public Client() throws IOException {
        try{
        SocketClient = new Socket("localhost",6789);
        in = new BufferedReader(new InputStreamReader(SocketClient.getInputStream()));
     out = new PrintWriter(SocketClient.getOutputStream(),true);
        }
        catch(IOException e)
        {
            System.err.println("Wrong again!");
            System.exit(1);
        }
        out.close();
        in.close();
        SocketClient.close();
    }
}
===============================================================================

正好我有时间,就看了一下,我以前没接触过 java 的 socket, 但我学过linux 下的c的socket,
不过也忘得差不多了,我从开始看到解决一共用了一个多小时,不过整理这些东西可花了不止一个小时了,
看到这些很着急的想知道自己的程序为什莫出错的人,真的感慨很多,自己也是从什莫都不知道,
程序一出错就傻眼的情况走过来的, 我是走过来了,可是还有很多走不来的,我想写一下我的分析过程,
这个题目不是什莫难题,但我想就这个说一下我对浮躁的看法,socket 我不翻译,因为我觉得叫套接字太奇怪了。

我看到例一也是什莫都不知道,我就上网随便找了两个client server的例子,然后再自己机器上运行了一下,
client 发的消息 server 能收到,client 如果发 end, 两边程序都退出,

然后我再看例一和例二有什莫区别,看到他就给我一个client的程序,我开始还以为,他就给我出错的那个呢,
于是,我用例二里的MyServer.java 当例一的server端,然后开始编译例一里的 client, 结果开始出来错误信息,
===============================================================================

Exception in thread "main" java.lang.NoSuchMethodError: main
===============================================================================


我看了他的程序,原来连 main 函数都没有 于是我又给他加上了 main 函数,

public static void main(String[] args) throws Exception {
    new Client();
}

然后又把端口改成一样的,结果就变成下面的了

===============================================================================

import java.io.*;
import java.net.*;
public class Client3 {
  
    private Socket SocketClient = null;
    private PrintWriter out = null;
    private BufferedReader in = null;
    public Client3() throws IOException {
        try{
        SocketClient = new Socket("localhost",5978);
        in = new BufferedReader(new InputStreamReader(SocketClient.getInputStream()));
    out = new PrintWriter(SocketClient.getOutputStream(),true);
        }
        catch(IOException e)
        {
            System.err.println("Wrong again!");
            System.exit(1);
        }
        out.close();
        in.close();
        SocketClient.close();
    }

public static void main(String[] args) throws Exception {
    new Client3();
}
}
 
===============================================================================


结果运行后,在server 端出现

===============================================================================
null
Exception in thread "main" java.lang.NullPointerException at MyServer.main<MyServer.java:18>
===============================================================================

结果找到了第18行也看不出来有什莫错,后来看到还有一个null, 找遍了MyServer.java,
只有这莫一行输出 System.out.println(str);


在 MyServer.java 里看这莫两行

String str = in.readLine();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

str 是被 调用 in 的一个叫 readLine 方法的返回值赋值的,可以查 java 的api, readLine 方法返回一个 String,
再看 in 是 BufferedReader 的一个实例,而BufferedReader的构造器里是以一个 Reader的类的实例当作参数的,
再查 Reader 类, 它下面派生了六个子类,其中就有 InputStreamReader 这个类,所以知道去看InputStreamReader类里的
构造器,发现InputStreamReader 构造器里的参数是一个 InputStream 的实例,client.getInputStream() 的返回值类型是InputStream 。


再看这两行

ServerSocket server = new ServerSocket(5978);
Socket client = server.accept();

于是再去查 client.getInputStream() 里的client,发现这里的client 是Socket 的一个实例,
再看 client 是被 server.accept();的返回值 赋值的, 找到 server 所在的类ServerSocket,
知道了 5987 是端口号,然后再回头把这些东西穿在一起,就明白这句的意思了,

就是建立一个服务器端的socket的实例 server,这个实例里有我们定义的端口号5978,
再创建一个socket 的实例 client ,它被赋值为server.accept();的返回值,
意思就是这个 socket 的实例client 跟客户端的请求连上了, 它处理客户端的情况,

BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
这句就是说, 建立一个BufferedReader 的实例 in, 它接受客户端穿过来的信息,

PrintWriter out = new PrintWriter(client.getOutputStream());
这句就是说, 建立一个PrintWriter 的实例 out, 它可以给客户端发信息,


 while (true) {
            String str = in.readLine();
            System.out.println(str);
            out.println("has receive...");
            out.flush();
            if (str.equals("end"))
                break;
        }
        client.close();


就是建立一个无限循环,得到客户端发来的消息, 服务器端打出来,然后再跟客户端说一下我收到了等等的,如果客户端打 end 就结束程序,
好了,这莫一来,弄清楚了,那个null 是打印出来的客户端发来的消息,也就是说客户端发过来个null, 
再比较例一和例二的客户端程序,发现少了一行
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));

然后才明白,wt是接受的键盘输入,而in在客户端表示的是从服务器端得到的消息,out才是从客户端发到服务器端的消息,
这个跟服务器端的in,out正好相反。

可是例一根本就没有定义键盘输入,那末你说服务器端怎末收到消息呢,于是我又加上了wt 这一行就基本可以运行了,
不过结束的时候还会出错,不过问题已经基本解决了。

可是到现在为止,我还没遇到他说的 Wrong again!,正当我百思不得其解的时候,

我正好忘了先运行服务器端的程序了,我先运行了服务器端的程序,结果忽然就蹦出来这个所谓的Wrong again!,

不会吧,说了这莫多,原来他连开两个命令行窗口,一个运行服务器,一个运行客户端都不知道啊。

对例一例二的总结,
例一明白是怎末回事就行了,因为这个程序写的漏洞百出,改不好还出新错误,
例二写的比较清楚,可以拿来当例子。


例二
===============================================================================
//Client.java

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

public class Client {
    static Socket server;

    public static void main(String[] args) throws Exception {
        server = new Socket(InetAddress.getLocalHost(), 5978);
        BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
        PrintWriter out = new PrintWriter(server.getOutputStream());
        BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            String str = wt.readLine();
            out.println(str);
            out.flush();
            if (str.equals("end")) {
                break;
            }
            System.out.println(in.readLine());
        }
        server.close();
    }
}


//MyServer.java

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

public class MyServer {
 
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(5978);
        Socket client = server.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        PrintWriter out = new PrintWriter(client.getOutputStream());
        while (true) {
            String str = in.readLine();
            System.out.println(str);
            out.println("has receive...");
            out.flush();
            if (str.equals("end"))
                break;
        }
        client.close();
    }
}


===============================================================================
附录, 一个用线程实现的接受多个客户端的服务器端的程序,如果有兴趣可以运行一下试试,我已经试过,可以运行的,
用上面例二里的客户端就可以了。


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

public class MultiUser extends Thread {
    private Socket client;

    public MultiUser(Socket c) {
        this.client = c;
    }

    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(client.getOutputStream());
            // Mutil User but can't parallel
            while (true) {
                String str = in.readLine();
                System.out.println(str);
                out.println("has receive...");
                out.flush();
                if (str.equals("end"))
                    break;
            }
            client.close();
        } catch (IOException ex) {
        } finally {

        }
    }

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(5978);
        while (true) {
            // transfer location change Single User or Multi User
            MultiUser mu = new MultiUser(server.accept());
            mu.start();
        }
    }
}


===============================================================================

对这个求人帮助的人的问题的总结,

第一 他连最基本的Socket的知识都不清楚,就说不知道为什莫会老出现 Wrong again!,
第二 我觉得他好像是,给好多人都发的,因为他的信看起来比较模式化

我不知道,他是为什莫要了解这方面的知识,为了应付考试,还是自己想学这方面的知识,
不管怎末说,我现在已经基本上了解了客户机服务器上的Socket的java编程,可是他呢,
花的时间比我多,而且我还不知道他能不能看得懂我上面都写了什莫,难道这就是他想要知道的答案吗,
现在好了,知道了答案了,又能怎样,别人告诉你了,你会了吗,如果他用给别人发信求助的时间多查一下书,多找一下资料的话,
说不定早就知道了。

我记得我以前遇到c++里不会的地方,就去问老师,老师就不怎末解答,我当时还纳闷呢,这都没学过怎末编啊,现在看来不给你解答却是最好的解答。

是,在软件开发的代码实现阶段,大家讨论是有好处的,可是这种讨论是建立在能独立思考独立解决问题的能力之上的,如果没有了这种能力,不知道讨论会变成什莫不可想象的样子。

这就是所谓的浮躁,虽然这两个字不怎么好听,也不怎么好看,可是它却实是学计算机的人一直要警惕的东西。

http://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=6




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值