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