【问题标题】:Java server would accept only one entry from my clientJava 服务器只接受来自我的客户端的一个条目
【发布时间】:2015-06-09 11:17:17
【问题描述】:

我已经创建了一个连接到 MySQL 数据库并接受来自客户端的请求的多线程服务器。服务器应该始终监听客户端命令,但这不会发生。它只接受一个命令,将其发送到数据库并获取我需要的任何内容,然后就完成了。它不再接受任何命令。 我为您提供客户端和服务器。

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.ConnectException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;


public class Airlines {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket connection = null;
		int port = 1234;
		try{
			serverSocket = new ServerSocket(port);
			while ((connection = serverSocket.accept())!=null){
			System.out.println("Client connected!");
			Thread client = new Thread (new AirlinesThread(connection));
			client.start();
			}
		}catch (IOException e){
			System.out.println("Binding unsuccesful...");
		}
	}

}
class AirlinesThread implements Runnable{
Socket connection = null;
public AirlinesThread (Socket connection){
	this.connection = connection;
}
private static Connection connect(String url, String user, String password){
    Connection result = null;
    try{
      result = DriverManager.getConnection(url, user, password);
      System.out.println("Database connection successful!");
    }
    catch(SQLException e){
      System.out.println("Could not connect to the database!");
    }
    return result;
  }
	String url = "jdbc:mysql://localhost:3306/Airlines";
	String user = "root";
	String pass = "123456";
	Connection link = AirlinesThread.connect(url, user, pass);
	Statement stmt = null;
	ResultSet resultSet = null;
	public void run() {
		PrintWriter socketOut = null;
		DataInputStream socketIn = null;
		try{
		socketOut = new PrintWriter(this.connection.getOutputStream(),true);
		socketIn = new DataInputStream(this.connection.getInputStream());
		int command;
		boolean exists = false;
		socketOut.flush();
		loop:do{
			socketOut.flush();
			command = socketIn.readInt();
			switch (command){
			case 1:
				 try{
				      stmt = link.createStatement();
				      resultSet = stmt.executeQuery("select Flight.id, Flight.Date, Flight.Time, Flight.Total_Flight_Time, Airports.Departure, Airports.Arrivals FROM Flight, Airports WHERE Flight.id = Airports.Flight");
				      socketOut.flush();
				      socketOut.println("FlightID\tDate\t\tTime\t\tTotal Time\tDeparture\tArrivals");
				      while (resultSet.next()) {
				    	  socketOut.println(resultSet.getString("Flight.id")+"\t\t"+resultSet.getDate("Flight.Date")+"\t"+resultSet.getString("Flight.Time")+"\t"+resultSet.getString("Flight.Total_Flight_Time")+"\t\t"+resultSet.getString("Airports.Departure")+"\t"+resultSet.getString("Airports.Arrivals"));
				       
				      }
				    }
				    catch(SQLException e){
				    	System.out.println("Something went wrong at 1");
				    }
				break;
			case 2:
				try{
				      stmt = link.createStatement();
				      resultSet = stmt.executeQuery("select Flight.id, Flight.Date, Flight.Time, Pilots.First_Name, Pilots.Last_Name from Flight RIGHT JOIN Pilots ON Flight.id = Pilots.FlightID;");
				      socketOut.flush();
			    	  socketOut.println("FlightID\tDate\t\tTime\t\tFirst Name\tLast Name");
			    	  exists = resultSet.next();
				      if(exists == false){
				    	  socketOut.flush();
				    	  socketOut.println("Wrong request!");
				    	  System.out.println("Wrong query at 2");
				      }
				      while (resultSet.next()) { 
				     socketOut.flush();
				       socketOut.println(resultSet.getString("Flight.id")+"\t\t"+resultSet.getDate("Flight.Date")+"\t"+resultSet.getString("Flight.Time")+"\t"+resultSet.getString("Pilots.First_Name")+"\t\t"+resultSet.getString("Pilots.Last_Name"));
				      }
				    }
				    catch(SQLException e){
				    	System.out.println("Something went wrong at 2");
				    }
				break;
			case 3: 
				try{
				      stmt = link.createStatement();
				      resultSet = stmt.executeQuery("select Food.Breakfast, Airplanes.Plane_Model FROM Food, Airplanes Where Food.FlightID=Airplanes.Plane_Model;");
				      exists = resultSet.next();
				      if(exists == false){
				    	  socketOut.flush();
				    	  socketOut.println("Wrong request!");
				    	  System.out.println("Wrong query at 3");
				      }
				      while (resultSet.next()) { 
				       socketOut.flush();
				       socketOut.println(resultSet.getString("Food.Breakfast")+"\t\t"+resultSet.getString("Airplanes.Plane_Model"));
				       
				      }
				    }
				    catch(SQLException e){
				    	System.out.println("Something went wrong at 3");
				    }
				break;
			case 0 :
				socketOut.flush();
				socketOut.println("Exitting...");
				break loop;
			default:
				System.out.println("Unknown command!");
				socketOut.println("Unknown command!");
				break;
			}
		}while(command!=0);
		System.out.println("Closing connection to the client!");
		}catch (IOException e){
			e.printStackTrace();
		}finally{
		        try{
		          if (socketIn!=null) socketIn.close();
		          if (socketOut!=null) socketOut.close();
		          if (connection!=null) connection.close();
		          System.out.println("Connection to server closed!");
		        }
		        catch(IOException e){
		          System.err.println("Could not close connection!");
		        }
	}
		try{
			if(stmt != null) stmt.close();
			if(resultSet != null) resultSet.close();
	        if(link != null) link.close();
	        System.out.println("Database connection closed successfully!");
		}catch(SQLException ex){
			System.out.println("Could not close connection to the database!");
		}  
  }
}

客户:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;


public class AirlinesClient {

	public static void main(String[] args) {
		Socket connection = null;
		Scanner socketIn = null;
		DataOutputStream socketOut = null;
		int port = 1234;
		String host = "localhost";
		Scanner keyIn = new Scanner(System.in);
		try{
			try{
			connection = new Socket(host,port);
			socketIn = new Scanner(new BufferedReader(new InputStreamReader(connection.getInputStream())));
			socketOut = new DataOutputStream(connection.getOutputStream());
		}catch(ConnectException e){
			System.out.println("Could not connect to the host!");
			return;
		}
		System.out.println("Successfully connected to the server!");
		System.out.println("Select from the options below:\n1: Check schedules\n2: Check pilots shifts\n3: Check corresponding airplanes and food offered\n4: Possible pilot shift changes");
		loop:do{
			int command;
			socketOut.flush();
			command = keyIn.nextInt();
			socketOut.flush();
			socketOut.writeInt(command);
			while (socketIn.hasNext()){
				System.out.println(socketIn.nextLine());
			}
			
		}while(keyIn.nextInt()!=0);
		System.out.println("Closing connection to server!");
	}catch(IOException e){
		e.printStackTrace();
	} finally{
	       try{
	           if(socketIn!=null) socketIn.close();
	           if(socketOut!=null) socketOut.close();
	           if(connection!=null) connection.close();
	         }
	         catch(IOException e){
	           System.err.println("Socket could not be closed!");
	         }
	       }
		
	}
	
	
}

【问题讨论】:

    标签: java mysql server


    【解决方案1】:

    问题是您在客户端中使用Scanner。执行挂在socketIn.hasNext(),因为

    public boolean hasNext()

    如果此扫描器在其输入中有另一个令牌,则返回 true。此方法可能会在等待输入扫描时阻塞。扫描仪不会超过任何输入。

    如果有新输入或底层流已关闭(我们不希望这样),代码将继续执行。您必须有一种在不关闭流的情况下知道传输结束的方法。请看下面非常简单的一个。

    在您的服务器中每个try-catch block 的末尾放置

    socketOut.println("$$$");
    

    在客户端中将socketIn 声明为BufferedReader 并实例化为

    socketIn = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    

    在客户端也将您的 loop 循环更改为

    int command = keyIn.nextInt();
    do {
        socketOut.flush();
        socketOut.writeInt(command);
        String line;
        while (!(line = socketIn.readLine()).equals("$$$"))
            System.out.println(line);
    } while ((command = keyIn.nextInt()) != 0);
    

    这也将解决您对keyIn.nextInt() 的双重检查。在您的代码中,您每次循环调用它两次(第一次迭代除外)。

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 2012-03-17
      • 2023-03-10
      相关资源
      最近更新 更多