第四次过程性考核

使用套接写连接编写一个简单的聊天室程序,客户端主函数放在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

时间: 2024-08-26 19:20:34

第四次过程性考核的相关文章

[2018-2019上 网络工程] 第4次过程性考核

题目 [2018-2019上 网络工程] 第四次过程性考核 问题简述 大部分同学都没有提交课堂练习到码云之中. 很多同学的代码都不可运行,以致代码部分没有分数. 没有同学完成向数据库或向文件中写聊天内容. 已经是最后一次考核,但依然有同学博客园中的代码排版混乱,真的是不用心啊. 第四次过程性考核成绩 代码 博客 码云 学号 程序可运行 客户端可和服务端通信 代码文件按要求命名 从控制台输入 实现文件(数据库)的读写操作 将聊天的内容和时间保存到文本文件(数据库)中 多线程通信 知识点 程序设计思

16012014_李鑫第三次过程性考核

码云地址:https://gitee.com/lixin-123/16012014 课堂练习:https://gitee.com/lixin-123/16012014a 7-1输出数组元素 本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果. 设计思路:首先定义一个数组,定义两个变量,然后使用FOR循环 运用到的知识点:数组,FOr循环 代码: import java.util.Scanner; public class Main{ public st

第一次过程性考核——结构化程序设计

码云仓库的地址:https://gitee.com/wslgx/codes 7-1 Hello World! (5 分) 本题要求编写程序,输出一个短句"Hello World!". 输入格式: 本题目没有输入. 输出格式: 在一行中输出短句"Hello World!". 程序的设计思路:直接在输出代码里填上所要输出的内容. 知识点:System.out.println("要输出的内容"):. 运行结果: 7-2 求1到100的和 (10 分)

[2018-2019上 网络工程] 第二次过程性考核

一.Deadline 代码部分 PTA教学平台:本次过程性考核课程下课(PTA教学平台会自动截止) 码云:2018-10-13 20:00(以码云上的提交时间为准) 博客部分 2018-10-13 20:00(班级博客会自动截止) 二.评分基准: 本次博客分为两部分: PTA教学平台,以教学平台的评价结果为准(50分) 码云,以博客提供的链接为准(20分) 博客部分(30分) 注意事项 按时交 有分 晚交(一周之内) 得分减半 抄袭 倒扣本次作业分数 迟交一周以上 倒扣本次作业分数 没有在班级博

第一次过程性考核

本次考核共四道题 一:Hello World! 码云地址:https://gitee.com/xjw-xjw/codes/a24x63tqmlc1d9ihyrv0g16 运行结果      : 知识点           :输出基本数据型:System.out.println(): 二:求1到100的和. 本题要求编写程序,计算表达式 1 + 2 + 3 + ... + 100 的值. 码云地址:https://gitee.com/xjw-xjw/codes/tel7b3xgdjk1pr8q9n

第一次过程性考核-邹彤

1.Hello World! https://gitee.com/ztsxxny/codes/kradjqwlb2gopvfn6ch8559 解析:简单的输出程序,注意语法即可. 2.求1到100的和 https://gitee.com/ztsxxny/codes/k8v0nxi3s9czow4mhre7q65 解析:利用while实现1到100的累加 public class Main{  public static void main(String[] args){    int i=1; 

第二次过程性考核!

码云地址:https://gitee.com/bhma/codes/s57mefv2y0483irwtncb938 7-5 jmu-Java-03面向对象基础-01-构造函数与toString import java.util.Scanner; class Person{ private String name = null; private int age = 0; private boolean gender = false; private int id = 0; public Perso

第三次过程性考核

7-2 字符串逆序 输入一个字符串,对该字符串进行逆序,输出逆序后的字符串. 知识点:stringbuffer //修改内容 StringBuffer sb =new StringBuffer(str)//初始化 代码片段: import java.util.Scanner; public class Main{ public static void main (String [] args){ Scanner n=new Scanner (System.in); String str=n.ne

第二次过程性考核

码云仓库地址:      https://gitee.com/ahy16012003/codes 第一题 (1)题目: 定义一个有关学生的Student类,内含类成员变量: String name.String sex.int age,所有的变量必须为私有(private). (2)代码: import java.util.Scanner;class Student{ String name,sex; int age; private String getName(){ return name;