首页 新闻 会员 周边

java的tcp聊天小程序,从登录开启的客户端无法与服务器连接,这个有谁知道大概从哪里排查问题吗?

0
悬赏园豆:15 [已关闭问题] 关闭于 2017-08-02 08:41

登录窗口启动的客户端无法与主机相连。

正常情况:先启动服务端,正常。

     启动客户端,服务端提示客户端以连接,然后能正常通信。

异常情况:先启动服务端,正常

     启动登录框,输入账号密码,正常

     客户端启动,无报错,服务端无提示连接,发送一条消息,提示空指针异常。

安然mlg的主页 安然mlg | 初学一级 | 园豆:176
提问于:2017-08-01 11:20
< >
分享
所有回答(3)
0

telnet 试试可不可以连上服务器,如果可以,那就是你的代码问题,不行的话说明服务器没开启

青语 | 园豆:1000 (小虾三级) | 2017-08-01 11:25

自己写的ServerSocket服务器,如果不加登录的话,可以客户端可以连上服务器的。

支持(0) 反对(0) 安然mlg | 园豆:176 (初学一级) | 2017-08-01 11:29

@安然mlgm: 登录代码贴出来看看

支持(0) 反对(0) 青语 | 园豆:1000 (小虾三级) | 2017-08-01 11:35

@青语: 

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
        
    }
}
支持(0) 反对(0) 安然mlg | 园豆:176 (初学一级) | 2017-08-01 11:37

@安然mlg: 没看出有啥问题

支持(0) 反对(0) 青语 | 园豆:1000 (小虾三级) | 2017-08-01 13:06

@青语: 我也很纳闷,为什么启动起来连不上。

支持(0) 反对(0) 安然mlg | 园豆:176 (初学一级) | 2017-08-01 13:08
0

server端是怎么写的,

要让server端保持可请求的状态

苍枫露雨 | 园豆:1027 (小虾三级) | 2017-08-01 14:51

也是不行的,没什么提示,就是连不上。

支持(0) 反对(0) 安然mlg | 园豆:176 (初学一级) | 2017-08-01 14:58
0

解决方法:当通过登录框启动客户端时,提示空指针异常。
造成空指针异常无非有以下几种:
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对象实例化过程写在,构造函数里就行了。

安然mlg | 园豆:176 (初学一级) | 2017-08-02 08:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册