Я новичок в серверных / клиентских приложениях и "Исключение в потоке" основной "java.net.SocketException: сброс подключения" продолжает выскакивать - PullRequest
0 голосов
/ 27 марта 2019

Это код сервера, который должен подключить сервер к базе данных библиотеки mysql.Я пытаюсь запустить класс CLIENT из терминала с именем автора в качестве аргумента, но я продолжаю получать соединение сброса по какой-то причине.Я знаю, что это означает, что клиент не получил данные и вместо этого закрыл соединение, но я не уверен, почему это происходит

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.ServerSocket;

import java.sql.*; 

public class LibraryServer {

  private int port = 8080;

  private ServerSocket serverSocket;

  //URL of DB server and authentication string
  static final String dbURL =
    "jdbc:mysql://localhost/" + 
    "user=root&password="...";

  //In the constructor, load the Java driver for the MySQL DB     server
  //to enable this program to communicate with the database 
  public LibraryServer() throws ClassNotFoundException {
    Class.forName("com.mysql.jdbc.Driver");
  }

  public void acceptConnections() {

    try {
  //similar to the WelcomeSocket in the PowerPoint slides
      serverSocket = new ServerSocket(port);
    }
    catch (IOException e) {
      System.err.println("ServerSocket instantiation failure");
      e.printStackTrace();
      System.exit(0);
     }

//Entering the infinite loop
    while (true) {
      try {
  //wait for a TCP handshake initialization (arrival of a "SYN"     packet)
        Socket newConnection = serverSocket.accept();
        System.out.println("accepted connection");

  //Now, pass the connection socket created above to a thread and     run it in it

  //First create the thread and pass the connection socket to it
  //This is a non-blocking function: constructor of the class     ServerThread
        ServerThread st = new ServerThread(newConnection);

  //Then, start the thread, and go back to waiting for another TCP  connection
  //This also is not blocking
        new Thread(st).start();
      }
      catch (IOException ioe) {
        System.err.println("server accept failed");
      }
    }
  }

  public static void main(String args[]) {

LibraryServer server = null;
   try {
      //Instantiate an object of this class. This will load the JDBC database driver
      server = new LibraryServer();
    }
    catch (ClassNotFoundException e) {
      System.out.println("unable to load JDBC driver");
      e.printStackTrace();
      System.exit(1);
    }

//call this function, which will start it all...
    server.acceptConnections();
  }

  //Internal class
  class ServerThread implements Runnable {

    private Socket socket;
    private DataInputStream datain;
    private DataOutputStream dataout;

    public ServerThread(Socket socket) {
  //Inside the constructor: store the passed object in the data member 
      this.socket = socket;
    }

//This is where you place the code you want to run in a thread
//Every instance of a ServerThread will handle one client (TCP connection)
    public void run() {
      try {
  //Input and output streams, obtained from the member socket object 
        datain = new DataInputStream(new BufferedInputStream
          (socket.getInputStream()));
        dataout = new DataOutputStream(new BufferedOutputStream
          (socket.getOutputStream()));
      }
      catch (IOException e) {
        return;
      }
      byte[] ba = new byte[6];
      boolean conversationActive = true;

      while(conversationActive) {
        String author = null;
        try {
    //read from the input stream buffer (read a message from client)
          datain.read(ba,0,6);
          author = new String(ba);
          //Exit when a "Q" is received from a client
          if ((author.length() == 1) && 
              (author.toUpperCase().charAt(0) == 'Q')) {
            conversationActive = false;
          }
          else {
            System.out.println("requested author = " + author);
            String names = getNames(author);
            System.out.println("names: " + names);
            System.out.println("writing " + names.length() + " bytes");

   //Write to the output stream buffer (send a message to client)
            dataout.write(names.getBytes(),0,names.length());
            dataout.write("\n".getBytes(),0,1);
            dataout.flush();
          }
        }
        catch (IOException ioe) {
          conversationActive = false;
        }
      }
      try {
        System.out.println("closing socket");
        datain.close();
        dataout.close();
  //When the server receives a "Q", we arrive here
        socket.close();
      }
      catch (IOException e) {
      }
    }

//This function is for communicating with the database server
//using API provided by the JDBC driver loaded at the top
    private String getNames(String author) {
      String result = "None available";
      Connection conn = null;
      try {
        conn = DriverManager.getConnection(dbURL);
        System.out.println("YALLA");
        Statement stmt = conn.createStatement();
        String query = "SELECT Title " +
                       "FROM Book " + "WHERE Author = " + 
                       "'" + author.trim() + "'" +
                       " ORDER BY Book_ID";
        System.out.println("query = " + query);
        ResultSet rs = stmt.executeQuery(query);
        StringBuffer sb = new StringBuffer();
        while (rs.next()) {
          sb.append(rs.getString(1));
          sb.append(", ");
          sb.append(rs.getString(2));
          sb.append('$');
        }
        result = sb.toString();
      }
      catch (SQLException e) {
        System.out.println(e.getMessage());
        result = "server error";
      }
      finally {
        if (conn != null) {
          try {
            conn.close();
          }
          catch (SQLException e) {
          }
        }
      }
      return result;
    }
  }
}

Код клиента:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class LibraryClient {
    private static String AuthName = null;
    @SuppressWarnings("resource")
    public static void main(String[] args) throws IOException  {
        // TODO Auto-generated method stub
        try {
            AuthName = args[0];
            }
        catch (ArrayIndexOutOfBoundsException error) {
            System.out.println("Please Enter a Filename!");
        }
         Socket socket = new Socket("192.168.0.114",8080);
          OutputStream out = socket.getOutputStream();
         PrintWriter p = new PrintWriter(out,true);
         p.println("test");


     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     String response = in.readLine();
      System.out.println(response);


    }

}
...