创建服务器首先就要输入端口号,如果端口号是自己输入,一切都好说,但是要别人输入,就需要考虑一些情况了。
端口号是从JTextField中取得的,而JTextField传出的是String,这需要用到Integer.parseInt转换为int。Integer.parseInt的要求比较多,不能什么都不输,不能输除0~9之外的任何字符,输入的数字不能超过-2,147,483,647~+2,147,483,647等。这就要求在调用Integer.parseInt之前要排除以上的异常,为此我写了几个小函数:
//判断输入的是否是0~9
private boolean stringTF(JTextField jtf){
String s=jtf.getText()+" ";
if(!nullTF(s)){
s=s.trim();
byte[] bb=s.getBytes();
for(int i=0;i<s.length();i++){
if(bb[i]<48||bb[i]>57){
return false;
}else{
}
}
return true;
}
return false;
}
//判断是否为空
private boolean nullTF(String s){
if(s.equals(" ")){
return true;
}else{
return false;
}
}
//判断端口是否可用//还差检查是否占用
private boolean portTF(JTextField jtf){
if(stringTF(jtf)){
num=Integer.parseInt(jtf.getText());//取得端口文本区的字符串并转换为整型
if(num<=65535&&num>=0){
return true;
}
return false;
}else{
return false;
}
}
其中我比较纠结的是不输入情况,报错时显示的是数据格式例外,提示给的是String s="";。这个在判断是即不算null,又不是" "。在一开始时,我在创建JTextField时加了个" ",但这样治标不治本,不光有两个位置可以出现光标,而且输入时可能会加上空格。经过长时间的改动,我终于开化了,在getText()时加了个" "。让高手见笑了。
关于输入范围的处理我还没有实现,不过有两个想法,一是把一个事件监听器放入一个线程中持续检测输入(因为事件监听器不能在输入时检测),二是加一个键盘监听器。
而如何检测端口是否被占用,我还没什么思路,想用ping但又感觉不行也不会在程序中调用。想到这里,又要深一步思考,0~1024都是知名端口,我是否会把其他程序的端口占了呢。我觉得应该个端口输入者在输入0~1024时一个提示,不要抢了同行的饭碗,与人方便与己方便。
希望今天能有所突破。