Topic: 在写一个通讯程序时居然遇到这样的问题,活不下去了

  Print this page

1.在写一个通讯程序时居然遇到这样的问题,活不下去了 Copy to clipboard
Posted by: debugger
Posted on: 2003-10-24 18:18

我正在写一个通讯程序,分为客户端和服务器两部分,客户端输出采用以下方式实现:
out = new PrintWriter(new OutputStreamWriter(new
BufferedOutputStream(
clientSocket.getOutputStream()), "GB2312"));

服务器端读取采用以下方式实现:
BufferedReader in = new BufferedReader(new
InputStreamReader(clientSocket.
getInputStream(), "GB2312"));

通讯格式固定:1.客户端用out.println()发出指令 2.客户端用out.println()发出与指令相对应的参数。 3.out.flush();

服务器端使用in.readLine();读取客户端发来的指令,用一大堆if() else if()判断收到的是什么指令,进入相应的程序块。在对应的程序块中再用readLine读取参数,并进行相应处理。

原理应该很简单,实现的时候却遇到了巨大的痛苦。我debug程序的时候发现,所有的if判断条件总是不符合。譬如,从客户端收到"login"指令,却不能进入if(strCmd == "login") {}进行处理。我甚至将从客户端收到的指令转换为byte[],将服务器端的常量"login"也转为byte[]进行比较,发现完全是一样的,可是为什么条件表达式就是不成立呢?

各位快帮帮我吧,我都要疯了。

2.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: debugger
Posted on: 2003-10-24 18:23

彻底疯了,我把输入输出中的"GB2312"统统去掉了,还是一样的。

唉,以我的认知水平,看来没法解决这个问题了,好高高手,你在哪里?

3.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: floater
Posted on: 2003-10-24 22:13

StrCmd.equals("login")

4.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: hwx
Posted on: 2003-10-24 22:33

呵呵,原来问题在这里。
有时候人一胡涂,很容易犯这种错误呢。

5.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: floater] Copy to clipboard
Posted by: helloworld
Posted on: 2003-10-24 23:14

我也遇到过,跟踪输出明明是一样的,可是用==就是不行,

只好最后用equals()

6.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: hwx
Posted on: 2003-10-24 23:47

String比较不能用==的,那是两个对象引用之间的比较,
要比较String的内容,用equals才保险。

7.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: hwx] Copy to clipboard
Posted by: why
Posted on: 2003-10-25 02:31

hwx wrote:
String比较不能用==的,那是两个对象引用之间的比较,
要比较String的内容,用equals才保险。

not only 用equals才保险,
but MUST 用equals Smile

we aren't using JavaScript.

8.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: yeehya
Posted on: 2003-10-26 19:30

估计都是先学的c。
大家都说java和c 很像,好上手;
但是也会很害人的。

9.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: yeehya] Copy to clipboard
Posted by: why
Posted on: 2003-10-26 22:11

yeehya wrote:
估计都是先学的c。
大家都说java和c 很像,好上手;
但是也会很害人的。


How's it related to 先学的C?
There's no String class in C, and one has to use strcmp(sq, s2) or
compare char by char.

10.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: why] Copy to clipboard
Posted by: helloworld
Posted on: 2003-10-26 22:16

呵呵,可以研究一下String的intern() 方法的用法........

使用intern()方法返回的所有字符串都可以通过使用==来进得比较...速度快,省内存.

11.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: debugger
Posted on: 2003-10-27 09:01

谢谢各位的指点,确实是个小问题。主要原因是我看书一目十行,在书上看String类的用法时,只看了例子程序,将程序中的==误认为是比较两个字符串内容的方法。有了各位的指点,我又回去看看书,发现书上是这样写的:

操作符==用于比较引用和比较基本数据类型时具有不同功能。当基本数据类型用==来比较时,如果两个值相同,结果就是true。当引用作==比较时,如果两个引用都指向内存中的同一个对象,则结果为true。为了比较对象实际内容(或状态信息)的相等性,必须激活特定方法(如equals)。

看来,一目十行害死人啊。:)不过,现在总算澄清了这个概念,也算长了知识。谢谢各位的解答。

12.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: helloworld] Copy to clipboard
Posted by: Biubiu
Posted on: 2003-10-27 12:22

helloworld wrote:
呵呵,可以研究一下String的intern() 方法的用法........

使用intern()方法返回的所有字符串都可以通过使用==来进得比较...速度快,省内存.


会省内存吗?调用intern的String都会被加到pool里去,这些String都不可能被垃圾收集的,为什么会省内存呢?如果String太多,只会让memory高居不下吧。

13.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: Biubiu] Copy to clipboard
Posted by: nothing
Posted on: 2003-10-27 12:29

指的是String不多,但比较的次数多..

14.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: nothing] Copy to clipboard
Posted by: Biubiu
Posted on: 2003-10-28 12:24

nothing wrote:
指的是String不多,但比较的次数多..


应该是对经常比较的String用这种方法吧,其它的就免了。Big Smile

15.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: cyz99
Posted on: 2003-10-28 13:37

呵呵,这种错误是很低级的错误哦,我现在都不会范这种错了!

16.Re:在写一个通讯程序时居然遇到这样的问题,活不下去了 [Re: debugger] Copy to clipboard
Posted by: floater
Posted on: 2003-10-29 01:32

You never know, I am still making stupid mistakes, nature of the beast!


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923