登录窗口启动的客户端无法与主机相连。
正常情况:先启动服务端,正常。
启动客户端,服务端提示客户端以连接,然后能正常通信。
异常情况:先启动服务端,正常
启动登录框,输入账号密码,正常
客户端启动,无报错,服务端无提示连接,发送一条消息,提示空指针异常。
telnet 试试可不可以连上服务器,如果可以,那就是你的代码问题,不行的话说明服务器没开启
自己写的ServerSocket服务器,如果不加登录的话,可以客户端可以连上服务器的。
@安然mlgm: 登录代码贴出来看看
@青语:
package com.java.chat; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class Loginc extends JFrame implements ActionListener{ //super("登录聊天室"); //boolean f = true; private JFrame frame; private JPanel jp; private JButton b1; private JButton b2,b3,b4; private JLabel lname,lpwd,infor; private JTextField txtname; private JPasswordField txtpwd; public Loginc(){ super("登录聊天系统"); frame = new JFrame(); jp = new JPanel(); jp.setLayout(null); b1 = new JButton("登录"); b2 = new JButton("取消"); //frame.add(jp); jp.add(b1); jp.add(b2); b1.setBounds(60,90,60,25); b2.setBounds(125,90,60,25); lname = new JLabel("用户名:"); lpwd = new JLabel("密 码:"); infor = new JLabel("请输入用户名和密码"); txtname = new JTextField(20); txtpwd = new JPasswordField(20); txtpwd.setEchoChar('*'); infor.setBounds(40,5,500,30); lname.setBounds(30,30,60,25); lpwd.setBounds(30,60,60,25); txtname.setBounds(90,30,120,25); txtpwd.setBounds(90,60,120,25); jp.add(lname); jp.add(lpwd); jp.add(infor); jp.add(txtname); jp.add(txtpwd); this.add(jp); this.setSize(250,170); this.setLocation(300,300); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //登录添加事件监听 b1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(e.getSource()==b1){ String tname = txtname.getText(); String tpwd = new String(txtpwd.getPassword()); Login log = new Login(tname,tpwd); if(log.vali()){ //System.exit(0); Loginc panle = new Loginc(); //panle.dispose(); //frame.remove(jp); new Client(); //System.exit(0); } else{ infor.setText("密码或用户名错误,请重新输入!"); } } } }); } //new Thread(this).start(); /*public void run(){ b1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(e.getSource()==b1){ String tname = txtname.getText(); String tpwd = new String(txtpwd.getPassword()); Login log = new Login(tname,tpwd); if(log.vali()){ //System.exit(0); Loginc panle = new Loginc(); panle.setVisible(false); //panle.dispose(); //frame.remove(jp); new Client(); //System.exit(0); } else{ infor.setText("密码或用户名错误,请重新输入!"); } } } }); }*/ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } }
@安然mlg: 没看出有啥问题
@青语: 我也很纳闷,为什么启动起来连不上。
server端是怎么写的,
要让server端保持可请求的状态
也是不行的,没什么提示,就是连不上。
解决方法:当通过登录框启动客户端时,提示空指针异常。
造成空指针异常无非有以下几种:
1.空指针异常发生在对象为空,但引用了这个对象。
2.一个变量是null,只有变量名,但没有实际内容,也没有分配内存,当你要取他的长度时,会出现空指针异常。
3.变量为空,而你没有去判断,就直接使用,写程序时严谨些,尽量避免了。
例如在拿该变量与一个值比较时,要么先做好该异常的处理如: if (str == null) { System.out.println("字符为空!"); }
当然也可以将这个值写在前面进行比较的,例如,判断一个String的实例s是否等于“a”,不要写成s.equals("a"),
这样写容易抛出NullPointerException,而写成"a".equals(s)就可以避免这个问题。不过对变量先进行判空后再进行操作比较好。
4.尽量避免返回null,方法的返回值不要定义成为一般的类型,而是用数组。这样如果想要返回null的时候,就返回一个没有元素的数组。
就能避免许多不必要的NullPointerException,使用NullObject返回代替返回null确是一种不错的选择。
5.NullPointerException这个东西换一个角度来看,没准是好处也不一定。可以说,NullPointerException本身也是Java安全机制的一部分。
而在空指针异常的位置有一个Socket对象而在空指针出现的位置是引用的位置,先用if(socket==null)测试是否为空,测试结果能走到下一步。
而整个程序中出现socket对象只有两处,第一个是初始化对象,第二个是实例化对象,初始化对象肯定没有毛病,那么就是说程序未走到实例化对象的位置,
我在程序中把实例化对象写在了main函数里,就是在运行时为给socket对象赋值,结果就是把给socket对象实例化过程写在,构造函数里就行了。