1、在Console程序中,Main函式一般不会做事,只是把别人new出来,因为如果做事就会被static限制住。并且一般不会只new,一般new完后会调用方法来“开始”。
2、Server的manager人有两个全局变量,一个存着所有的与客户端对接的人,一个存着客户的名称。:这样从维护性来讲不好,因为别人在移除时可能不知道要移除List内容时候,要同时移除两个。同时前者又能实现后者的全部功能。
3、ListenFunction
方法名不正确,主机应该是开始接受
4、newClient.RemoveNameEvent += new ClientMember.RemoveNameHandle( ClientMember_RemoveNameEvent );
事件命名以及方法命名有问题,RemoveNameEvent
这个事件的名称应该写实际的动作,不应该写执行的名称,例如改为:客户端断线
;ClientMember_RemoveNameEvent
这个方法名是程式自动生成的,不应该用这个,应该改为RemoveName
就很合适
5、
void newClient_BroadCastEvent ( byte [ ] BroadCastBuffer )
{
for ( int i = 0 ; i < m_AllClientMember. Count; i++ ) {
m_AllClientMember[ i ] . BroadCastMessage ( BroadCastBuffer ) ;
}
}
在上述代码中 BroadCastMessage
的方法名不合适,因为每一个ClientMember
做的事情就不是广播
了,做的事情只是发送
,所改为Send
比较合适
6、
for ( int i = 0 ; i < m_szNameList. Count; i++ ) {
if ( m_szNameList[ i ] == szName ) {
byte [ ] DuplicateCodingBuffer = Encoding. UTF8. GetBytes ( "duplicate" ) ;
DuplicateCodingBuffer. CopyTo ( AnswerBuffer, 0 ) ;
acceptSocket. Send ( AnswerBuffer ) ;
isNameRepeated = true ;
}
}
if ( isNameRepeated ) {
continue ;
}
这里的isNameRepeated
变量是否有必要存在,没有找到很好的办法解决它,但是,只是找到名字重复后,应该break
,减少无效的代码执行。
7、这里没有必要用到public
来宣告方法/变量,只需要用internal
来宣告,就可以在同一个Project中调用到。
8、类的成员要分开,如分成Internal
、private
等。
9、触发事件的时候,要检查一下是不是null
10、一些数字改成常量,如端口号"5678",发送/接收长度:“128”等等
11、由于对接收和发送的长度都为128,因此会有很多重复的操作是的发送的长度固定为128,此处的代码就可以抽出为一个方法来重复使用
12、一般情况下,属性还是对应一个字段比较好。此处Name
属性由于习惯性,还是建立一个m_szName
的字段,方便以后扩充。
13、窗体类要以Frm
开头,如:FrmChatRoomUI
14、一般自建的类,要partial
分成四块:public
、internal
、protected
以及private
。就算里面没有内容,也得分成四块,这样结构清晰,扩充容易。注意:
一般的不需要用public
来宣告,在同一个命名空间下只用internal
就够了。
15、
ChatAcceptSocket newLoginSocket = new ChatAcceptSocket ( szIP, szName ) ;
bool isNameRepeated = newLoginSocket. ConnectError;
这段代码有两个问题:
第一、我在ChatAcceptSocket
建构子中做了太多事情了,一般情况下,不要在建构子中做太多事情,可以new出来以后,再调用方法做事。
第二、ConnectError
属性存在的必要性,此处可能没有问题,但是由于开发给外部了,那本身就会代表一个实时性的,而我本身只在建构子中对它进行了赋值操作。这就造成如果别人用的时候,它的状态可能就不准了。解决方法:
把它做成一个返回bool
的方法,这样就比较好。
16、检查IP地址格式是否正确部分代码,其实没有必要。因为用了try...catch
在connect
方法中,所以只要connect
方法执行失败,就一定是ip不正确。
另一种解决方案:
可以通过类似“ping”的方式,来看IP以及端口是否是正确的。如果正确再执行connect
方法,这样就少用了一个try...catch
。