0

我正在尝试用 Java 制作一个基本的电子邮件系统。我有一个客户端连接到的服务器和一个客户端的 gui。当服务器从客户端获取新连接时,它会启动一个运行的新线程来处理所有不同的操作。问题是服务器接受新客户端但没有启动新的客户端处理程序线程运行。有什么帮助吗?

public class Server {
   public static Connection link;

   public static void main(String[] args) throws IOException {
      ServerSocket serverSocket = null;
      final int PORT = 1234; // Define the sockets and ports and i/o
      Socket client;
      ClientHandler handler;

      try {
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         link = DriverManager.getConnection("jdbc:odbc:emails", "", "");
         System.out.println("Connected to Database . . . ");
      } catch (ClassNotFoundException cnfEx) {
         System.out.println("* Unable to load driver! *");
         System.exit(1);
      } catch (SQLException sqlEx) {
         System.out.println("* Cannot connect to database! *");
         System.exit(1);
      }

      try {
         serverSocket = new ServerSocket(PORT); // Set the server socket
      } catch (IOException ioEx) {
         System.out.println("\nUnable to set up port!"); // If failed let the
                                                         // user know
         System.exit(1); // Exit the system with error code 1
      }

      System.out.println("\nServer running...\n"); // Tell the user the server
                                                   // is running

      do {
         client = serverSocket.accept();
         // Wait for client.
         System.out.println(client);
         handler = new ClientHandler(client);
         System.out.println(handler);
         System.out.println("\nNew client accepted.\n"); // Tell the user the
                                                         // server has accepted
                                                         // a client
         System.out.println("RUNNING");
         handler.start(); // Start the handler

      } while (true); // Continuous loop
   }

   static class ClientHandler extends Thread {
      /**
 * 
 */
      private Socket client;
      private ObjectInputStream input; // Define sockets, i/o and local array
                                       // list
      private ObjectOutputStream output;

      public ClientHandler(Socket socket) throws IOException // Client handler
                                                             // constructor
      {
         client = socket;
         input = new ObjectInputStream(socket.getInputStream());// Set client
                                                                // and i/o
                                                                // stream
         output = new ObjectOutputStream(socket.getOutputStream());
      }

      public void run() {
         String userCommand = null;
         System.out.println("RUNNING CLIENT HANDLER");
         boolean quit = false;

         do {

            try {
               userCommand = (String) input.readObject();
            } catch (IOException e2) {
               // TODO Auto-generated catch block
               e2.printStackTrace();
            } catch (ClassNotFoundException e2) {
               // TODO Auto-generated catch block
               e2.printStackTrace();
            } // Receive user command

            if (userCommand.equals("SEND MESSAGE")) // If user command is to
                                                    // send a message
            {
               String username = null, recipient = null, message = null, insert, fileType = null;

               try {
                  username = (String) input.readObject();
                  recipient = (String) input.readObject(); // Receive username,
                                                           // recipient and
                                                           // message
                  message = (String) input.readObject();
                  fileType = (String) input.readObject();
               } catch (IOException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
               } catch (ClassNotFoundException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
               }

               insert = "INSERT INTO [emails] ([From], [To], [Message], [Attachment])"
                     + " VALUES('"
                     + username
                     + "','"
                     + recipient
                     + "','"
                     + message + "','" + fileType + "')";
               Statement statement = null;
               try {
                  statement = link.createStatement();
                  statement.executeUpdate(insert);
                  link.commit();
               } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }

               try {

                  getFile(input, fileType);
               } catch (IOException ioEx) {
                  ioEx.printStackTrace();
               } catch (ClassNotFoundException cnfEx) {
                  cnfEx.printStackTrace();
               }

               System.out.println(username // Tell the user a message has been
                                           // sent
                     + " sent message to " + recipient);
            }

            if (userCommand.equals("READ MESSAGE")) // If user command is to
                                                    // read a message
            {
               String username = null; // Define local variables

               try {
                  username = (String) input.readObject();
               } catch (IOException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
               } catch (ClassNotFoundException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
               } // Receive the username of the current user
               Statement statement = null;
               String insert = "SELECT [Email No],[From],[Message],[Attachment] FROM [emails] WHERE To = '"
                     + username + "'";
               ResultSet rs = null;
               try {
                  statement = link.createStatement();
                  rs = statement.executeQuery(insert);
               } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }

               try {
                  while (rs.next()) {
                     String from = rs.getString("From");
                     String message = rs.getString("Message");
                     String attachment = rs.getString("Attachment");
                     int emailNo = rs.getInt("Email no");
                     output.writeObject(from);
                     output.writeObject(message); // Send the username the
                                                  // message is from
                     output.writeObject(attachment);
                     output.writeObject(emailNo);
                     output.flush(); // and the message and flush the output
                                     // stream
                  }
               } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }

               try {
                  output.writeObject("END");
               } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               } // Send an end message
               try {
                  output.flush();
               } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               } // Flush the output stream

               System.out.println(username // Tell the user someone is reading
                                           // their messages
                     + " reading messages.");

            }

            if (userCommand.equals("QUIT")) // If the user command is quit
            {
               quit = true; // Set quit to true
            }

            if (userCommand.equals("DELETE MESSAGE")) // If the user command is
                                                      // delete a message
            {
               int valueToDelete = 0; // Define local variables

               try {
                  valueToDelete = Integer.parseInt((String) input.readObject());
               } catch (NumberFormatException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
               } catch (IOException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
               } catch (ClassNotFoundException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
               } // Receive the value to delete
               Statement statement = null;
               String delete = "DELETE FROM emails WHERE [Email No] = "
                     + valueToDelete + "";
               try {
                  statement = link.createStatement();
                  statement.executeUpdate(delete);
                  link.commit();
               } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }
               System.out.println("Deleted message " + valueToDelete); // Tell
                                                                       // the
                                                                       // user a
                                                                       // message
                                                                       // has
                                                                       // been
                                                                       // deleted
            }
         } while (!quit); // Run while quit is false

         System.out.println("Client Closed"); // Tell the user the client has // closed
      }

      private static void getFile(ObjectInputStream inStream, String fileType)
            throws IOException, ClassNotFoundException {

         byte[] byteArray = (byte[]) inStream.readObject();
         FileOutputStream mediaStream = null;

         if (fileType.equals("Text File"))
            mediaStream = new FileOutputStream("file.txt");
         else if (fileType.equals("Image"))
            mediaStream = new FileOutputStream("file.gif");
         else if (fileType.equals("Movie"))
            mediaStream = new FileOutputStream("file.mpeg");

         mediaStream.write(byteArray);
      }
   }
}
4

1 回答 1

0

当您实例化 ObjectInputStream 时,它将阻塞,直到客户端发送足够的标头,因此您永远无法实际运行线程...... 另请参阅

于 2012-05-01T12:00:11.453 回答