“刘皓吗?你还是如此的有意思,就是不知道你有没有这个资格做我的对手。”蓝染忽右介一边离开一边想道。

“的确是这样。”伊西丝没有任何隐瞒,毕竟这的确是事实,不少国家都是如此,真正能做到将好的东西,好的食物留给自己国家的人享用,坏的,不好的送出去的国家也就是发达的国家而已,而且也不多。

可以微信上下分的棋牌游戏

虽然赵阳的嘴上对胡松是一片鄙视,但是他的语气颇有些吃不到葡萄说葡萄酸的味道。
众人都很配合地让开来,等谭校长和雪飞鸿坐下,再分坐在四周,看着两人的对话。

老师愣了愣,王文倒是站起来说道:“老师,他们的确是,只是好久没来了。”

基于TCP协议的项目架构之Socket流传输的实现


项目背景

    某银行的影像平台由于使用时间长,服务器等配置原因,老影像系统满足不了现在日益增长的数据量的需求,所以急需要升级改造。传统的影像平台使用的是Oracle数据库和简单的架构来存储数据(视频、图片等),所以很难满足现在的业务需求,其中最主要的就是存储下载等速度的影响,综合考虑之后,我们给出了升级改造方案,基于Http协议的数据传输和基于TCP协议的数据传输,按照行方的要求需要用TCP协议,我们最终采用的是Socket网络传输的方案。

TCP协议介绍

  TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,TCP层位于IP层之上,应用层之下的中间层,不同主机的应用层之间经常需要可靠的、像管道一样的连接,但IP层不需要提供这样的机制,而是提供不可靠的包交换。当应用层向TCP层发送用于网间传输的、用8位字节标示的数据流,TCP会把数据流分割为适当长度的报文段,之后TCP把数据包传给IP层,由它来通过网络将包传输给接收端的实体TCP层。TCP是因特网中的传输层协议,使用3次握手协议建立连接。

Socket

        TCP通信是严格区分客户端与服务端的,在通信时,必须先由客户端去连接服务器才能实现通信,服务器端不可以主动连接客户端,并且服务器要事先启动,等待客户端的连接。

        在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器,一个是Socket类,用于表示客户端。通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接,开始通信。

        下面是我们通过Socket建立的模型,是多线程的,首先看服务端代码:

/**
 * socket服务端
 * @author 我心自在
 *
 */
public class Main {
    private static Log logger=null;
    //线程池
    public static ExecutorService executor =null;
    /**
     * 静态块,初始化
     */
    static{
        logger=LogFactory.getLog(SocketMain.class);
        //线程池
        executor = Executors.newFixedThreadPool(Integer.parseInt(new PropertiesUtil().
                getProperties("config.properties").getProperty("UserThreads")));
        }
    /**
     * 主程序入口
     * @param args
     */
    public static void main(String[] args) {
        ServerSocket server = null;
        Socket socket = null;
        PropertiesUtil PropertiesUtil = new PropertiesUtil();
        try {
        //启动Socket服务端
    server=newServerSocket(Integer.parseInt(PropertiesUtil.getProperties("config.properties")
                    .getProperty("port")));
            while (true) {
                //多线程接收客户端请求
                socket = server.accept();
                if (socket != null) {
                    executor.execute(new Controller(socket));
                }
            }
        } catch (IOException e) {
            logger.error("Main IO异常:"+e.getMessage(),e);
        } finally {
            try {
                if (server != null) {
                    server.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                logger.error("Main流关闭异常:"+e.getMessage(),e);
            }
        }
    }
}

下面是业务处理类,支持多线程,主要用来处理业务

public class SocketController implements Runnable {
    private Socket socket;
    private static Log logger=LogFactory.getLog(SocketController.class);
public SocketController(Socket socket) {
        super();
        this.socket = socket;
    }
public void run() {
        //读取文件流
        String requestMethod=null;
        Map<String,Object> getMethAndNumMap=null;
        Map<String,Object> jsonMap=null;
        BufferedInputStream  bis =null; 
        OutputStream ops = null;
        BufferedWriter bw = null;
        BufferedOutputStream bos = null;
        Document doc=null;
        String XMLString=null;
        try {
            bis= new BufferedInputStream (socket.getInputStream());
            //获取输出流
            ops = socket.getOutputStream();
            bos = new BufferedOutputStream(ops);
            bw = new BufferedWriter(new OutputStreamWriter(ops));
            byte[] fileinfo=new byte[256];
            try {
                bis.read(fileinfo);
            } catch (IOException e1){
                logger.error("流读取异常...."+e1.getMessage(),e1);
            }
            if(fileinfo!=null){
                fileInfoString=new String(fileinfo).trim();
            }
            jsonMap=JSONUtil.jsonToMap(fileInfoString);
            requestMethod=(String) jsonMap.get("requestMethod");
                if (!(requestMethod==null||"".equals(requestMethod))) {
                    switch (requestMethod){ 
                    case "login":
                        Login.login(XMLString,bw,doc);//登录接口
                        break;
                    case "XXXX":
                        XXX.xxx();
                        break;
                    default:
                //请求方法错误

                    }
                }
        } catch (UnknownHostException e) {
            logger.error("Socket未知端口:"+e.getMessage(),e);
        } catch (IOException e) {
            logger.error("Controller读流流异常:"+e.getMessage(),e);
        }finally{
            try {
                if (bw!=null) {
                    bw.flush();
                    bw.close();
                }
                if(ops!=null){
                    ops.close();
                }
                if(bos!=null){
                    bos.close();
                }
                bis.close();
                socket.close();
            } catch (IOException e) {
                logger.error("socket关闭异常:"+e.getMessage(),e);
            }
        }
    }
        

  这里只贴出了部分代码,做个参考,基本思想就是,通过输入流接到客户端发送过来的报文,然后进行解析,为什么统一用字节流接受呢,因为我们的文件上传分两部分,一部分是文件信息,一部分是文件流,所以为了方便,统一使用字节流接收,根据字节流中的请求接口方法,调用对应的接口方法,完成业务处理。因为客户端的报文有两种,一种是XML类型的报文,另外一种是json格式的报文,这里只贴出了部分json格式的代码。差的只是一个XML的解析,解析方式很多,就不再赘述。

下面是客户端代码,以登录为例:

public class LoginTest {
    public static void main(String[] args) {
        String xml = 
                "<?xml version="1.0" encoding="utf-8"?>"
                    + "<root>"
                        + "<requestMethod>login</requestMethod>"
                        + "<userinfo>"
                            + "<loginname>test</loginname>"    
                            + "<passwd>dmd1dnZndXY=</passwd>"
                        + "</userinfo>"    
                    + "</root>";
        Socket socket=null;
        BufferedWriter bw=null;
        BufferedReader br=null;
        try {
            socket=new Socket(new ConfigUtil().getValue("ipAddress"), 
                    Integer.parseInt(new ConfigUtil().getValue("port")));
            bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write(xml);
            bw.newLine();
            bw.flush();
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("服务器返回报文:"+br.readLine());
            bw.close();
            br.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    

  客户端代码非常简单,基本就是以流的形式发送报文,发送到客户端,完成请求,收到服务器响应后,关闭连接,完成一次请求。

  以上只是一个简单的Socket通信模型,具体项目中涉及到很多内容,这里无法一一列举。大致思路我们就是通过Socket通信,获取客户端发送过来的报文,然后对报文进行解析,根据请求方法,调用不同的业务接口,处理不同的业务,我们的业务包括对影像资料的增删改查,文件根据不同的大小存在大数据集群中,小文件存入Hbase,大文件存入HDFS,然后根据不同的场景去查询删除或者更新。这里边涉及到的存索引,用到了Elasticsearch5.4,用来做高级检索查询。

当前文章:http://hnhdqp.com/69426.html

发布时间:2019-02-24 02:26:24

方舟方块世界内测下载 方块娱乐棋牌是真的吗 富狗棋牌人工客服电话 广东十一选五推荐号 大字版手机五条翻牌机 李逵劈鱼支付宝提现 调兵山舞蹈 折菠萝三角怎么叠图解

编辑:董扁

相关新闻

佳县举办青少年文学创作大赛

2019-02-24 00:18:30

垦利颖滤信息科技有限公司

舒淇涂大红唇出席活动 穿低胸装秀好身材

2019-02-24 00:03:21

白山装易游工贸有限公司

榆林城区2014年拟发布PM2.5数据

2019-02-24 00:55:57

漳州刈梁投传媒

《旋风十一人》热播 苏幻俊演绎最帅门将

2019-02-24 00:30:42

咸阳桥鞍广告传媒有限公司

热门推荐

  • 山东省旅游发展委出重拳整治旅游饭店违规行为
  • 四川遂宁通报:一技校95人送医4危重 疑食用未熟扁豆中毒
  • 深度学习框架演进史
  • 英国脱欧啃下三大“硬骨头” 即将展开第二轮谈判
  • 《黑暗与光明》“炙热深渊”来袭,限时67折突破史低!
  • 小甜甜布兰妮晒儿子绘制雷姆美图引盛赞:大触风范
  • 章子怡不是好后妈?网友:让孩子和奶奶住没什么不好
  • 游泳肩、蛙泳腿、下腰痛,这些游泳损伤该如何预防?
  • 江西8市发生严重暴雨洪涝灾难 7人罹难7人失踪
  • 四川茂县发生山体高位垮塌 河流堵塞2公里
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:点石成金翻牌机游戏 四川麻将血战到底技巧
  • 有试玩糖果派对平台吗 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 怎样下载波克斗地主 诈金花看牌器 能提现棋牌游戏苹果 2019最火现金棋牌官网