读写套接字,Java

3
我在我的Java服务器/客户端应用程序中存在一些读写Socket的小问题。服务器与数据库连接。我想向服务器发送一个包含用户数据(姓名、姓氏、密码)的"Employee"对象,然后服务器在数据库中查找这个用户并向客户端重新发送信息-正(1)或负(-1)。
首先,当我想发送一个Employee对象时,我遇到了以下错误: "java.net.SocketException: Software caused connection abort: socket write error", 我已经关闭了防火墙。
其次,当我只想通过writeInt-readInt方法发送和接收int进行测试时,在服务器上无法读取任何内容。
出现什么问题了?请帮忙解决。
服务端代码:
class ClientCommunication implements Runnable {
    private Socket incoming;

    public ClientCommunication(Socket clientSocket) {
        incoming = clientSocket;

    }

    public void run() {
        try {
            synchronized (this) {
                try {                   
                    serverObjectOutput = new ObjectOutputStream(
                            incoming.getOutputStream());
                    serverObjectInput = new ObjectInputStream(
                            incoming.getInputStream()); 
                } finally {
                    incoming.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        synchronized(this) {
            while (true) {
                try{                        
                    int operation = serverObjectInput.readInt();                        

                    switch(operation) {
                    case 1:
                            Employee employee = (Employee) serverObjectInput.readObject();
                            String SelectUserDataSQL = "SELECT COUNT(*) AS COUNT FROM pracownik where Imie = ? AND Nazwisko = ? AND Haslo = ?";
                            PreparedStatement CheckEmployeeLogin;
                            CheckEmployeeLogin = conn.prepareStatement(SelectUserDataSQL);

                            CheckEmployeeLogin.setString(1, employee.getFirstName());
                            CheckEmployeeLogin.setString(2, employee.getLastName());
                            CheckEmployeeLogin.setString(3, new String(employee.getPassword()));                    

                            ResultSet resultSQL = CheckEmployeeLogin.executeQuery();
                            if (resultSQL.next()) 
                                if (resultSQL.getInt("COUNT") == 0)
                                    serverObjectOutput.writeInt(1);
                                else serverObjectOutput.writeInt(-1);
                            break;
                }
            } catch(IOException | ClassNotFoundException | SQLException ex)                 
            {                   
            }
          }
        }
    }
}

class ServerStart implements Runnable {
    private int portNumber;

    public ServerStart(int portNumber) {
        this.portNumber = portNumber;
    }

    public void run() {


        try {
            conn = getConnection();
            stat = conn.createStatement();

        } catch (SQLException e1) {             
            e1.printStackTrace();
        } catch (IOException e1) {              
            e1.printStackTrace();
        } catch (InterruptedException e) {              
            e.printStackTrace();
        }


        try {
            serverSocket = new ServerSocket(portNumber);                

        } catch (IOException e) {
            e.printStackTrace();                
        }


        try {
            while (true) {
                Socket incoming = serverSocket.accept();

                clientSockets.add(incoming);

                Runnable r = new ClientCommunication(incoming);
                Thread t = new Thread(r);
                t.start();
            }
        } catch (IOException e) {
            e.printStackTrace();                
        }
    }       
}

代码客户端:

public void actionPerformed(ActionEvent e) {
                if (isConnected == false) {
                    String ServerIP = ip.getText().trim();

                    int ServerPort = Integer
                            .parseInt(port.getText().trim());


                    try {
                        ClientSocket = new Socket(ServerIP, ServerPort);                        

                        clientObjectInput = new ObjectInputStream(
                                ClientSocket.getInputStream());
                        clientObjectOutput = new ObjectOutputStream(
                                ClientSocket.getOutputStream());

                        isConnected = true;
                    } catch (IOException ex) {                          
                    }
                    synchronized (this) {
                        try {                               
                            ClientLoginFrame login = new ClientLoginFrame();

                            Employee employee = login.getEmployee();                                                                

                            clientObjectOutput.writeObject(employee);                               
                            int result = clientObjectInput.readInt();

                            if(result == 1)
                            {       
                                  // DO SOMETHING
                            }
                            else { 
                                ClientSocket.close();                                   
                            }                           
                        } catch (IOException ex) {
                            ex.printStackTrace();

                        }
                    }
                }
            }
        });
    }       

3
嗨,安德鲁,您在这里提出了两个问题:使用对象进行客户端-服务器通信时出现SocketException,并且在使用readInt时出现“无法读取任何内容”。您能否将代码示例简化到只剩下有问题的代码,并准确描述在使用“readInt” /“writeInt”时出现的错误? - L-Ray
当我使用writeInt()和readInt()时,没有任何错误,但是如果我想进行测试,在客户端上写入writeInt(1),并在服务器上执行readInt(),然后显示接收到的值,例如console.append("" + result),我在控制台上什么也看不到。 - Andrew
我稍微修改了一下代码,现在更短更易读了。希望能够让人更容易理解。 - Andrew
1个回答

2
  1. 在你的 catch(IOException | ClassNotFoundException | SQLException ex) 中添加一个 ex.printStackTrace(),以查看发生了什么。

  2. 服务器端,在你的 ClientCommunication 类中:似乎你在进入 while 循环之前就关闭了套接字。因此,套接字已经关闭,无法发送/接收消息。你不应该在那里调用 incoming.close(),而是在你的 run() 方法结束时调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接