您的位置:首页 > 其它

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

2006-10-09 20:26 369 查看
我对浮躁的看法,慢慢添加,

好多人抱怨自己找不到好的工作,好的实习,继而怨天尤人,什莫招聘靠关系什莫的,
其实应该从自己先找找原因,想想你跟 那个你希望的工作的要求差多远,
不要说很简单,工作几天慢慢上手就行了,举个例子吧,
本来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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: