Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC arraylist进行简单的套接字编程和线程_Java_Multithreading_Sockets_Jdbc_Arraylist - Fatal编程技术网

Java 使用JDBC arraylist进行简单的套接字编程和线程

Java 使用JDBC arraylist进行简单的套接字编程和线程,java,multithreading,sockets,jdbc,arraylist,Java,Multithreading,Sockets,Jdbc,Arraylist,我已经在用JDBC、结果集等回答数据库中的一些问题了。。。然后将其放入ArrayList中。。并通过JavaGUI显示所有内容 但是,现在我想使用套接字、线程等扩展它。。要学习这个教职员 这次我想使用三层体系结构方法,其中数据库访问是 在与同一个旧数据库交互的应用程序层中排序。 应用程序层将像服务器一样接受传入的数据 多个客户端的请求,并提供与数据级别的交互 我尝试这样的东西 服务器端:回答问题(20个tf问题,8个倍数),写入arraylist并发送到客户端。 我只发送问题。我怎样才能同时发送

我已经在用JDBC、结果集等回答数据库中的一些问题了。。。然后将其放入ArrayList中。。并通过JavaGUI显示所有内容

但是,现在我想使用套接字、线程等扩展它。。要学习这个教职员

这次我想使用三层体系结构方法,其中数据库访问是 在与同一个旧数据库交互的应用程序层中排序。 应用程序层将像服务器一样接受传入的数据 多个客户端的请求,并提供与数据级别的交互

我尝试这样的东西

服务器端:回答问题(20个tf问题,8个倍数),写入arraylist并发送到客户端。 我只发送问题。我怎样才能同时发送倍数

这是真的吗? 是否需要螺纹?我如何实现这个线程

public class trainingServer {

    static ArrayList<TrueFalse> truefalseList = new ArrayList<TrueFalse>();
    static ArrayList<Multiple> multipleList = new ArrayList<Multiple>();
    static ArrayList<String> clientAnswers = new ArrayList<String>();


     public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {

            Connection con; 
            Statement st;
            ResultSet resultSet, resultSet2;

            ServerSocket serverSocket = null;

            Socket clientSocket = null;
            ObjectOutputStream out = null;
            ObjectInputStream in = null;
            PrintWriter outScore = null;



            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost/db", "root", "");
            st = con.createStatement();

            try {
                  serverSocket = new ServerSocket(9999); //listening on port 9999
            } catch (Exception e) {
                  System.out.println("Port Error!");
            }

          System.out.println("Server is ready for connection..");
          clientSocket = serverSocket.accept();

          out = new ObjectOutputStream(clientSocket.getOutputStream());
          in = new ObjectInputStream(clientSocket.getInputStream());
          outScore = new PrintWriter(clientSocket.getOutputStream(), true);


          resultSet = st.executeQuery("SELECT No, Question, Answer FROM truefalse");

            //adding true/false questions and their answers to tfList from database
            while (resultSet.next())
            {
                TrueFalse qa = new TrueFalse();
                qa.number=resultSet.getInt(1);
                qa.question=resultSet.getString(2);
                qa.answer=resultSet.getString(3);
                truefalseList.add(qa);
            }

            //writing true-false part to object output stream to send client
//          for(TrueFalse tf : truefalseList)
//              out.writeObject(tf);  


            resultSet2 = st.executeQuery("SELECT No, Question, Ans1, Ans2, Ans3, Ans4, Ans5, Explanation, Trueans FROM multiple");

            //adding multiple questions and their answers to multList from database
            while (resultSet2.next())
            {
                Multiple qm = new Multiple();
                qm.num=resultSet2.getInt(1);
                qm.question=resultSet2.getString(2);
                qm.answer1=resultSet2.getString(3);
                qm.answer2=resultSet2.getString(4);
                qm.answer3=resultSet2.getString(5);
                qm.answer4=resultSet2.getString(6);
                qm.answer5=resultSet2.getString(7);
                qm.explanation=resultSet2.getString(8);
                qm.trueAns=resultSet2.getString(9);
                multipleList.add(qm);
            }

            //writing mult. part to object output stream to send client
//          for(Multiple mult : multipleList)
//              out.writeObject(mult);  


            out.writeUTF("Server ready");
            out.flush();
            // If we are here, then connection was probably not a portscan
            out.writeObject(truefalseList);
            out.writeObject(multipleList);
            out.flush();

            clientAnswers = (ArrayList<String>) in.readObject();

    //      score = (Score)in.readObject();
            // do something with score.
            outScore.println(checkAnswers());
            outScore.flush();

          out.close();
          in.close();
          outScore.close();
          clientSocket.close();
          serverSocket.close();


     }

     static int checkAnswers(){
         int score=0;
         for(int i=0 ; i<clientAnswers.size() ; i++)
         {
             if(i<20)
             {
                 if(clientAnswers.get(i).equalsIgnoreCase(truefalseList.get(i).answer))
                 {
                     score=score+3;
                 }

             }
             else
             {
                 int count=0;
                 if(clientAnswers.get(i).equalsIgnoreCase(multipleList.get(count).trueAns))
                 {
                     score=score+5;
                     count++;
                 }

             }



         }

         return score;


     }
}
公共类培训服务器{
静态ArrayList truefalseList=新ArrayList();
静态ArrayList multipleList=新ArrayList();
静态ArrayList clientAnswers=新ArrayList();
公共静态void main(字符串[]args)抛出IOException、SQLException、ClassNotFoundException{
连接con;
报表st;
结果集结果集,结果集2;
ServerSocket ServerSocket=null;
套接字clientSocket=null;
ObjectOutputStream out=null;
ObjectInputStream in=null;
PrintWriter outScore=null;
Class.forName(“com.mysql.jdbc.Driver”);
con=DriverManager.getConnection(“jdbc:mysql://localhost/db“,”根“,”);
st=con.createStatement();
试一试{
serverSocket=newserversocket(9999);//侦听端口9999
}捕获(例外e){
System.out.println(“端口错误!”);
}
System.out.println(“服务器已准备好连接…”);
clientSocket=serverSocket.accept();
out=newObjectOutputStream(clientSocket.getOutputStream());
in=newObjectInputStream(clientSocket.getInputStream());
outScore=新的PrintWriter(clientSocket.getOutputStream(),true);
结果集=st.executeQuery(“从truefalse中选择否、问题、答案”);
//从数据库向tfList添加真/假问题及其答案
while(resultSet.next())
{
TrueFalse qa=新的TrueFalse();
qa.number=resultSet.getInt(1);
qa.question=resultSet.getString(2);
qa.answer=resultSet.getString(3);
添加(qa);
}
//将真-假部分写入对象输出流以发送客户端
//用于(TrueFalse tf:truefalseList)
//out.writeObject(tf);
结果T2=st.executeQuery(“从多个选项中选择否、问题、答案1、答案2、答案3、答案4、答案5、解释、答案”);
//从数据库向multList添加多个问题及其答案
while(resultSet2.next())
{
多个qm=新的多个();
qm.num=resultSet2.getInt(1);
qm.question=resultSet2.getString(2);
qm.answer1=resultSet2.getString(3);
qm.answer2=resultSet2.getString(4);
qm.answer3=resultSet2.getString(5);
qm.answer4=resultSet2.getString(6);
qm.answer5=resultSet2.getString(7);
qm.explainion=resultSet2.getString(8);
qm.trueAns=resultSet2.getString(9);
多重列表添加(qm);
}
//将mult.part写入对象输出流以发送给客户端
//for(多个mult:multipleList)
//out.writeObject(mult);
out.writeUTF(“服务器就绪”);
out.flush();
//如果我们在这里,那么连接可能不是端口扫描
out.writeObject(truefalseList);
out.writeObject(multipleList);
out.flush();
clientAnswers=(ArrayList)在.readObject()中;
//score=.readObject()中的(score);
//用分数做点什么。
println(checkAnswers());
outScore.flush();
out.close();
in.close();
outScore.close();
clientSocket.close();
serverSocket.close();
}
静态int检查答案(){
智力得分=0;

对于(int i=0;i而言,真正的方法取决于您的非功能性需求。如果您希望非Java客户端从数据库请求(状态)数据,或者客户端位于代理之后,则将应用程序服务器作为web服务编写

由于您正在编写客户端将依赖的服务器,还需要考虑可伸缩性(在负载平衡器后面的多个web服务器上部署web服务)和可用性(如果一个web服务器出现故障,负载平衡器应将请求定向到其他仍在运行的web服务器)。并且不要忘记可维护性:理想情况下,您应该能够升级/降级您的应用程序服务器,而无需客户端注意

如果只有Java客户机(或者线上的数据只是类似telnet的问答类型文本),那么您将需要线程和数据库连接池。我曾经创建过这样一个“始终在线”的应用程序服务器。它包含一个可供您使用/查看以了解这些内容的应用程序(另请参阅单元测试)。还包括一个实现

我还将Yapool与一个框架结合起来,创建了一个可以部署在Tomcat上的war文件,将应用服务器公开为一个(非常简单的)web服务关于线程和连接:Tomcat为您做这件事。如果您想更进一步,我建议您学习

至于接两个
Socket soket = null;
    ObjectInputStream in = null;
    ObjectOutputStream out = null;
    BufferedReader inScore = null;


     try {       
            soket = new Socket("localhost",9999);

            in = new ObjectInputStream(soket.getInputStream());
            out = new ObjectOutputStream(soket.getOutputStream());
            inScore = new BufferedReader(new InputStreamReader(soket.getInputStream()));



            String serverReady = in.readUTF();
             tfList = (ArrayList<TrueFalse>) in.readObject();
             multList = (ArrayList<Multiple>) in.readObject();
    //       score = new Score();
             // prepare the score object
             out.writeObject(userAnswers);
             out.flush();
             // wait for server to process score
             returned_score = inScore.read();
             System.out.println(returned_score);

             // server has processed score and send "Bye".




     } catch (ConnectException ce) {
         System.out.println("Cannot connect to the server!");
     } catch (IOException ie) {
         System.out.println("I/O Error!");
     }

     in.close();
     out.close();
     inScore.close();
     soket.close();
out.writeUTF("Server ready");
out.flush();
// If we are here, then connection was probably not a portscan
out.writeObject(tfList);
out.writeObject(multipleList);
out.flush();
clientAnswers = (List<String>) in.readObject();
out.writeInt(checkAnswers());
out.writeUTF("Bye");
out.flush();
String serverReady = in.readUTF();
tfList = (List<TrueFalse>) in.readObject();
multipleList = (List<Multiple>) in.readObject();
out.writeObject(userAnswers);
out.flush();
// wait for server to check answers and return score
int returned_score = in.readInt();
String serverBye = in.readUTF();
// server has processed score and send "Bye".