TCP多人聊天室实现 JSON文件解析

31 篇文章 0 订阅

TCP多人聊天室实现 JSON文件解析

1. TCP多人聊天室实现
1.1 分析
客户端
	功能:
		1. 数据发送
		2. 数据接收
	技术:
		1. socket
		2. 输入流和输出流
		3. 多线程,客户端功能模块有两个线程
	聊天:
		1. 群聊
		2. 私聊
			私聊前缀 @服务器用户ID号:msg
	
服务器
	功能:
		1. 数据转发
		2. 用户注册
	技术:
		1. ServerSocket
		2. 每一个用户对应的Sokcet对象
		3. 多线程同时在线
		4. HashMap<Integer, 用户>
	数据转发:
		私聊前缀判断
		群聊所有人发送
1.2 客户端实现
数据发送:
	使用输出流发送数据给服务器
	遵从Runnable接口
数据接收:
	使用输入流从服务器端接收数据
	遵从Runnable接口

客户端主方法:
	用户名提交
	数据发送
	数据接收
		多线程启动
1.3 资源关闭问题
代码中操作了大量的输入流和输出流,这里都需要进行关闭操作。
	DataInputStream, DataOutputStream, BufferedReader, Socket
	
以上这些资源都是Closeable接口的实现类,都有对应的Close方法
封装一个工具类:
	提供一个closeAll方法,参数为符合Closeable接口的实现类对象。
	这里可以考虑可变长参数
		Closeable... closeable
	
	可变长参数在方法中使用的过程里面是对应一个数组,这里完成可以使用增强for来使用

工具类名:
	CloseUtil
		public static void closeAll(Closeable... closeable)
1.4 功能拓展
1. 用户退出
	用户输入指定字段之后可以退出
	客户端Socket服务
	服务端Socket服务
	涉及资源关闭,线程关闭

2. 用户异常退出
	在运行过程中发现问题,需要及时处理,关闭对应的资源,终止对应的线程

3. 服务器保存所有的聊天记录
2. JSON
2.1 JSON格式概述
JSON
	JavaScript
	JavaScript Object Notation
	(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯
{
     "firstName": "John",
     "lastName": "Smith",
     "sex": "male",
     "age": 25,
     "married": false,
     "address": 
     {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021"
     },
     "phoneNumber": 
     [
         {
           "type": "home",
           "number": "212 555-1234"
         },
         {
           "type": "fax",
           "number": "646 555-4567"
         }
     ]
 }
2.2 数据格式
2.2.1 JSON对象
{
    "ID":001, 
    "name":"骚磊", 
    "age":16
}
特征:
	1. 数据形式键值对形式
		"键":值
	2. 数据支持 字符串,数字,true false
	3. {} 大括号以内的数据
2.2.2 JSON对象数组
[
    {
    	"ID":1, 
    	"name":"骚磊", 
    	"age":16
	},
    {
        "ID":2, 
        "name":"骚杰", 
        "age":66
    },
    {
        "ID":3, 
        "name":"康康", 
        "age":15
    }
]
特征:
	1. 数据使用[]包含
	2. 在[]都是JSON格式对象
	3. 每一个对象之间使用逗号隔开,同时最后一个元素不需要逗号
2.2.3 JSON数据验证

JSON格式验证

2.3 解析JSON格式工具
常用的工具:
	Gson,fastjson, Jackson
	以上都是第三方工具,需要导入对应的jar包按使用
	XML导包
2.3.1 FastJson内容
JSON核心类
	JSON核心类提供解析和转化方法,用于解析JSON数据格式,同时用于转换类对象到JSON格式,该类对象需要符合JavaBean规范
	--| JSONArray
		存在按照键值对方式解析获取数据,同时存在一定的List方法
	--| JSONObject
		获取对应的类对象,指定键值对对应数据的方法
2.3.2 解析演示
/*
完成一个符合JavaBean规范的类
*/
public class Student {
    private Strint name;
    private Integer age;
    
    // 这里根据需要完成对应的Setter和getter方法
}
package com.qfedu.b_json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import jdk.nashorn.internal.ir.CallNode;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Anonymous
 * @description FastJson演示
 * @date 2020/3/9 16:34
 */
public class Demo1 {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        Student stu = new Student("骚磊", 16);
        list.add(stu);
        list.add(new Student("骚杰", 66));
        list.add(new Student("老黑", 56));
        list.add(new Student("老付", 36));
        list.add(new Student("老高", 66));

        /*
        JavaBean List ==> Json String
        */
        String s = JSON.toJSONString(list);
        System.out.println(s);

        System.out.println("--------------------------------------");

        /*
        JavaBean Student类对象 ==> Json String
         */
        String s1 = JSON.toJSONString(stu);
        System.out.println(s1);

        /*
        Json String == Java Bean Student
         */
        Student student = JSON.parseObject(s1, Student.class);
        System.out.println(student);


        /*
        Json String ==> Json Object
         */
        JSONObject jsonObject = JSON.parseObject(s1);
        String name = jsonObject.getString("name");
        System.out.println(name);
        System.out.println(jsonObject.getInteger("age"));

        /*
        Json String ==> JsonArray
         */
        JSONArray objects = JSON.parseArray(s);
        System.out.println(objects);

        for (Object object : objects) {
            JSONObject jsonObject1 = (JSONObject) object;

            System.out.println(jsonObject1.getString("name"));
            System.out.println(jsonObject1.getInteger("age"));
        }


        Student object = objects.getObject(2, Student.class);
        System.out.println(object);

        System.out.println("--------------------------------------");
        /*
        JSONArray ==> JavaBean List集合
         */
        List<Student> students = objects.toJavaList(Student.class);
        for (Student student1 : students) {
            System.out.println(student1);
        }

        // StudentMangaer ==> ArrayList ==> JSONString ==> 文件
        // 文件 ==> 程序 ==> JSONString ==> JSONArray ==> ArrayList

        System.out.println("--------------------------------------");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值