第四次过程性考核
码云地址:https://gitee.com/iseekun99/fourth
使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中
要求:
- 1.客户端从控制台进行输入,并将自己的输出内容和时间保存到数据库的“client_学号”表中
- 2.服务器端读取到客户端的程序后,从控制台进行输入给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到数据库的表中
- 3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个"ip_学号"的表
- 4.提交文件结果包括:代码,数据库导出为.sql文件
多线程机制
实现一个服务器同时与多个客户端进行简单的通信
客户端主函数:
import java.io.*; import java.net.*; import java.util.*;public class Client_Main{ public static void main(String args[]){ Socket mysocket; DataInputStream in = null; DataOutputStream out = null; try{ mysocket= new Socket("127.0.0.1",2010); in=new DataInputStream(mysocket.getInputStream()); out=new DataOutputStream(mysocket.getOutputStream()); for(int i = 0;i<100;i++){ Scanner scanner = new Scanner(System.in); String source= scanner.nextLine(); out.writeUTF(source); String s=in.readUTF(); System.out.println("客户收到服务器的回答:"+s); Thread.sleep(500); } } catch(Exception e){System.out.println("服务器已断开"+e);}
}
}
服务器端猪函数:服务器端需要开启多个线程用来与每一个客户端进行通信
import java.io.*; import java.net.*; import java.util.*;public class Server_Main{ public static void main(String args[]){ Scanner scanner=new Scanner(System.in); ServerSocket server=null; ServerThread thread; Socket socketOnServer=null; while(true){ try{ server= new ServerSocket(2010);} catch(IOException e1){ System.out.println("正在监听");} try{ System.out.println("等待客户呼叫"); socketOnServer = server.accept(); System.out.println("客户的地址:"+socketOnServer.getInetAddress());} catch(Exception e){System.out.println("客户已断开"+e);} if(socketOnServer!=null){new ServerThread(socketOnServer).start();} } } } class ServerThread extends Thread{ Scanner scanner=new Scanner(System.in); Socket socketOnServer; DataOutputStream out=null; DataInputStream in=null; String s=null; ServerThread(Socket t){ socketOnServer =t; try { System.out.println("等待客户呼叫"); out=new DataOutputStream(socketOnServer.getOutputStream()); in=new DataInputStream(socketOnServer.getInputStream()); for(int i=0;i<100;i++){ String s=in.readUTF(); System.out.println("服务器收到客户的提问:"+s); out.writeUTF(scanner.nextLine()); } } catch(Exception e){System.out.println("服务器已断开"+e);} } }
建一个简单的数据库表,来保存客户端、服务器端的通信内容与时间,创建了一个sql表
import java.sql.*;
public class GetDBConnection {
public static Connection connectDB(String DBName,String id,String p){
Connection con =null;
String uri="jdbc:mysql://localhost:3306/"+DBName+"?useSSL=true&characterEncoding=utf-8";
try{
Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e){}
try{
con=DriverManager.getConnection(uri,id,p);
}
catch(SQLException e) {}
return con;
}
}
ReceiveLetterForClient.java
import java.net.*; public class ReceiveLetterForClient implements Runnable{ public void run(){ DatagramPacket pack=null; DatagramSocket postman=null; byte data[] =new byte[8192]; try{ pack=new DatagramPacket(data,data.length); postman=new DatagramSocket(888); } catch(Exception e){} while(true){ if(postman==null) break; else try{ postman.receive(pack); String message=new String(pack.getData(),0,pack.getLength()); System.out.print("收到:"+message); } catch(Exception e){} } } }
ReceiveLetterForServer.java
import java.net.*; public class ReceiveLetterForServer implements Runnable{ public void run(){ DatagramPacket pack=null; DatagramSocket postman=null; byte data[] =new byte[8192]; try{ pack=new DatagramPacket(data,data.length); postman=new DatagramSocket(666); } catch(Exception e){} while(true){ if(postman==null) break; else try{ postman.receive(pack); String message=new String(pack.getData(),0,pack.getLength()); System.out.print("收到:"+message); } catch(Exception e){} } } }
运行结果如下: 可以与多个客户端进行简单的通信聊天
近期总结:对一个简单程序设计的整个框架有了大致的了解,在对各种方法的实际运用操作中还是存在很多问题。