1

我写了一个简单的即时通讯程序,它在 Eclipse 中运行良好。我想将它导出到 .jar 并在我的主计算机托管 java socketServer 时在多台计算机上运行它。该程序在 .jar 中运行服务器但从 eclipse 执行客户端时工作。但是当我运行我的 client.jar 时,它不会连接到服务器。我的代码的两部分都很长。我正在使用我的实际 IPv4 地址使用 socket(ipaddress, port#) 进行操作。我也在端口号 9000 上运行我不确定这是否有任何影响。我一直在搜索这个网站和许多其他网站,但我似乎找不到关于这个主题的已经开放的话题。我可能会补充一点,因为我一直在台式机和笔记本电脑之间切换,所以我将我的 IPv4 地址手动输入到 GUI 中。

Server.java 中的代码

serverUser = new ServerSocket(9000);
textArea.append("User Server created on " + new Date() + "\n");
serverChat = new ServerSocket(9100);
textArea.append("Chat Server created on " + new Date() + "\n");

while(true)
{
    Socket socket = serverUser.accept();
    clientNum++;
    new DataOutputStream(socket.getOutputStream()).writeUTF("You have connected to the server");
    User user = new User(socket, new DataInputStream(socket.getInputStream()).readUTF());
    userList.add(user);

client.java 中的套接字

public void actionPerformed(ActionEvent e) 
{
    boolean next = false;
    userName = userNameField.getText();
    password = new String(passwordField.getPassword());
    ipAddress = ipAddressField.getText();
    if(ipAddress.equals(""))
        status.setText("You must enter the IP Address of the Server");
    else
    {
        userNameField.setText("");
        ipAddressField.setText("");
        passwordField.setText("");
        query = "select * from User where userName = '" + userName + "' and password = '" + password + "'";
        try
        {
            line 328 ResultSet rs = statement.executeQuery(query);
            if(rs.next())
            next = true;    
            rs = statement.executeQuery("select * from User");
        }
        catch(SQLException ex)
        {
            System.out.println(ex.getMessage());
        }
        if(next)
        {
            tabbedPane.setEnabledAt(0, false);
            tabbedPane.setEnabledAt(1, true);
            tabbedPane.setSelectedIndex(1);
            logout.setEnabled(true);
            try
            {
                socket = new Socket(ipAddress, 9000);
                output = new DataOutputStream(socket.getOutputStream());
                input = new DataInputStream(socket.getInputStream());
                socket.setKeepAlive(true);
                socket.setTcpNoDelay(true);
                output.writeUTF(userName);
                output.flush();
                status.setText(input.readUTF());
                setTitle(userName);
                Thread thread = new Thread(new UpdateTask(userList));
                thread.start();
            }
            catch(IOException ex)
            {
                System.out.println(ex.getMessage());
            }
        }
        else
            status.setText("Invalid user name or password");
        }
    }

好的,我得到了错误,当然我的问题是错误的。问题最终成为令人讨厌的 nullPointer ,我也不知道我是如何得到的。这是错误

C:\Users\Satokaheni\Programs\Java Workspace\Runnable Jars>java -jar Client.jar
Works
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at UserMenu$6.actionPerformed(UserMenu.java:328)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

伙计,我真的很愚蠢,很抱歉弄错了问题,但你能帮忙解决这个问题吗?我知道查询不为空,因为我打印出来了。所以我不知道为什么它给了我一个 nullPointer

我找到了为什么我认为我得到了空指针

path to 'db/loginDB.db': 'C:\Users\Satokaheni\Programs\Java Workspace\Runnable Jars\db' does not exist

这是我的数据库代码

Class.forName("org.sqlite.JDBC");
try
{
    connection = DriverManager.getConnection("jdbc:sqlite:db/loginDB.db");
    statement = connection.createStatement();
}
catch(SQLException ex)
{
    System.out.println(ex.getMessage());
}

任何提示将不胜感激。

谢谢你。

PS如果你愿意,我可以发布代码。

4

0 回答 0