使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中
要求:
- 1.客户端从控制台进行输入,并将自己的输出内容和时间保存到数据库的“client_学号”表中
- 2.服务器端读取到客户端的程序后,从控制台进行输入给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到数据库的表中
- 3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个"ip_学号"的表
- 4.提交文件结果包括:代码,数据库导出为.sql文件
一:使用套接字编写多线程通信任务:
程序设计思路:
在前一节课TCP单线程通信任务上进行更改,多线程UDP通信任务。以书上张三和圆半径的例子为参考。但是,UDP多线程通信,需要用不同的IP地址进行通信,由于同一个主机IP地址相同,这里我们可以用不同的端口号进行通信。
如下图所示:服务器端线程的大致流程
客户端:
Client_Main.java
import java.net.*; import java.util.*; public class Client_Main { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); Thread readData; ReceiveLetterForServer receiver=new ReceiveLetterForServer(); try{ readData =new Thread(receiver); readData.start(); byte [] buffer=new byte[1]; InetAddress address=InetAddress.getByName("127.0.0.1"); DatagramPacket dataPack=new DatagramPacket(buffer,buffer.length,address,666); DatagramSocket postman=new DatagramSocket(); System.out.print("请输入给服务器发送到消息:"); while(scanner.hasNext()){ String mess=scanner.nextLine(); buffer =mess.getBytes(); /*String jilu="(mess,null)"; String sqlStr="insert into mess values"+jilu;*/ if(mess.length()==0) System.exit(0); buffer =mess.getBytes(); dataPack.setData(buffer); postman.send(dataPack); System.out.print("继续输入发给服务器的消息:"); } } catch(Exception e){ System.out.println("服务器已断开"+e); } /*try{ sql=con.createStatement(); int ok=sql.executeUpdate(sqlStr); rs=sql.executeQuery("select * from client_学号"); while(rs.next()){ String mess=rs.getString(1); String time=rs.getString(2); System.out.print(mess); System.out.print(time); } con.close(); } catch(SQLException e){ System.out.println(e); }*/ } }
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(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.printf("%25s\n","收到:"+message); } catch(Exception e){} } } } }
服务器端:
Server_Main.java
import java.net.*; import java.util.*; import java.sql.*; public class Server_Main { public static void main(String[] args) { /*Connection con=null; Statement sql; ResultSet rs; con =GetDBConnection.connectDB("students","root","111111"); if (con==null)return;*/ Scanner scanner=new Scanner(System.in); Thread readData; ReceiveLetterForClient receiver=new ReceiveLetterForClient(); try{ readData =new Thread(receiver); readData.start(); byte [] buffer=new byte[1]; InetAddress address=InetAddress.getByName("127.0.0.1"); DatagramPacket dataPack=new DatagramPacket(buffer,buffer.length,address,888); DatagramSocket postman=new DatagramSocket(); System.out.print("请输入给客户端发送到消息:"); while(scanner.hasNext()){ String mess=scanner.nextLine(); buffer =mess.getBytes(); /*String jilu="(mess,null)"; String sqlStr="insert into mess values"+jilu;*/ if(mess.length()==0) System.exit(0); buffer =mess.getBytes(); dataPack.setData(buffer); postman.send(dataPack); System.out.print("继续输入发给客户端的消息:"); } } catch(Exception e){ System.out.println("客户端已断开"+e); } /*try{ sql=con.createStatement(); int ok=sql.executeUpdate(sqlStr); rs=sql.executeQuery("select * from client_学号"); while(rs.next()){ String mess=rs.getString(1); String time=rs.getString(2); System.out.print(mess); System.out.print(time); } con.close(); } catch(SQLException e){ System.out.println(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(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.printf("%25s\n","收到:"+message); } catch(Exception e){} } } } }
二:将所需数据提出,建立SQL表格
因为不能提交文件夹,所以这里将文件内容粘贴在这里
/* Navicat MySQL Data Transfer
Source Server : ccy Source Server Version : 50520 Source Host : localhost:3306 Source Database : students
Target Server Type : MYSQL Target Server Version : 50520 File Encoding : 65001
Date: 2018-12-05 11:23:24 */
SET FOREIGN_KEY_CHECKS=0;
-- ---------------------------- -- Table structure for client_学号 -- ---------------------------- DROP TABLE IF EXISTS `client_学号`; CREATE TABLE `client_学号` ( `内容` varchar(255) DEFAULT NULL, `时间` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Records of client_学号 -- ----------------------------
-- ---------------------------- -- Table structure for ip_学号 -- ---------------------------- DROP TABLE IF EXISTS `ip_学号`; CREATE TABLE `ip_学号` ( `IP` varchar(255) DEFAULT NULL, `内容` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Records of ip_学号 -- ----------------------------
-- ---------------------------- -- Table structure for mess -- ---------------------------- DROP TABLE IF EXISTS `mess`; CREATE TABLE `mess` ( `number` char(50) NOT NULL DEFAULT ‘‘, `name` varchar(100) DEFAULT NULL, `birthday` date DEFAULT NULL, `height` float DEFAULT NULL, PRIMARY KEY (`number`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Records of mess -- ---------------------------- INSERT INTO `mess` VALUES (‘R1001‘, ‘张三‘, ‘2000-12-12‘, ‘1.78‘); INSERT INTO `mess` VALUES (‘R1002‘, ‘李四‘, ‘1999-10-09‘, ‘1.68‘); INSERT INTO `mess` VALUES (‘R1003‘, ‘赵小五‘, ‘1997-03-09‘, ‘1.65‘);
三:实现数据库
GetDBConnection.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(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.printf("%25s\n","收到:"+message); } catch(Exception e){} } } } }
过程性考核总结:
这次的过程性考核,首先,我的思路很清晰,前一节课的基于TCP的单线程通信任务的基础上,换成UDP多线程的,书上有一个张三的例子可作为参考。但具体的更改我没有完成,对于程序的编写,我很薄弱,有思路,但在各种方法的应用上还是不会。
JAVA学习总结:
在本学期的学习中,我知道了如何编写简单的JAVA小程序,尽管在课程最后我也不能做到交给我一个题目,我就能思路清晰的知道自己用什么方法,只能初步的有个大体的思路,但也算是入门JAVA学习了。同时,通过JAVA这学期的学习,让我巩固了很多数据结构里的算法和设计思路,让我有了很多收获。最后,学习还需要不断的努力,反思不足之处。才能有所进步。
学习内容 | 代码行数 | 博客字数 |
第四次过程性考核 | 192 | 200 |
原文地址:https://www.cnblogs.com/wrwrwr/p/10099626.html