zoukankan      html  css  js  c++  java
  • 简单的Socket介绍

    在这之前我们先了解一下一些关于网络编程的概念
      网络编程从大方面说就是对信息的发送和接收,中间传输为物理线路的作用,编程人员可以不用考虑
      网络编程最主要的工作就是在发送端吧信息通过规定好的协议进行组装包,在接收端按照规定好的
      协议进行包装解析,从而提取对应的信息,达到通信的目的
    网络编程的三要素
      1.IP地址
        唯一标识网络上的每一台计算机
      构成:32位,由4个8位二进制数组成
      
      IP地址=网络地址加主机地址
        网络地址:标识计算机或网络设备所在的网段
        主机地址:标识特定主机或网络设备
      
     
      2.端口
      "端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
     
     

    两类传输协议:TCP   UDP

      TCP就是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送

      方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个

      socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。

      UDP就是Use  Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的

      路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

    什么是Socket
      网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
      建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,
      这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

    Socket网络编程可以分为以下步骤

      1.建立连接

      2.打开Socket关联的输出流

      3.数据流读取信息

      4.关闭所有数据流和Socket

    Socket实现原理机制

      1.通信两端都有Socket  

      2.网络通信其实就是Socket间的通信

      3.数据在两个Socket间通过IO传输

     Socket 通信模型

      进行网络通信时,Socket需要借助数据流来完成数据流的传递工作

      

    如何实现多客户请求呢

    采用多线程方式

    一个专门负责监听的应用服务程序

    一个专门负责处理请求的线程程序

    DatagramPacket类

      封装了数据报的数据,数据长度,目标地址和目标端口

    DatagramSocket类

      接收和发送DatagramPacket对象封装好的数据报

    基于UDP协议的Socket网络编程步骤

      1.利用DatagramPacket对象封装数据报

      2.利用DatagramSocket发送数据报

      3.利用DatagramSocket接收数据报

      4.利用DatagramPacket处理数据报

    使用两种协议实现简单的对话功能(简单的对话功能)

     

     

     

    ServerSocket sk=new ServerSocket(11111);
            //2.监听
            Socket s=sk.accept();
            //打包数据
            BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));    
            BufferedReader bw=new BufferedReader(new InputStreamReader(System.in));
            OutputStream os=s.getOutputStream();
            String line=null;
            while((line=br.readLine())!=null){
                System.out.println("Client 	"+line);        
                
                os.write(bw.readLine().getBytes());
            }            
            //释放资源
            s.close();
            //sk.close();
        Socket sk=new Socket("192.168.111.1",11111);
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
            String line=null;
            while((line=br.readLine())!=null){            
                bw.write(line);
                bw.newLine();
                bw.flush();
                InputStream is=sk.getInputStream();            
                byte [] by=new byte[1024];
                int num=is.read(by);
                String h=new String(by, 0, num);
                System.out.println("Service:	"+h);
            }                    
                //br.close();
                //bw.close();
                sk.close();
    
    
        }

     实现结果

     

    ==============================================

     =======================================

     

    ========================================

     

  • 相关阅读:
    Linux 性能优化之 IO 子系统
    Percona 开始尝试基于Ceph做上层感知的分布式 MySQL 集群,使用 Ceph 提供的快照,备份和 HA 功能来解决分布式数据库的底层存储问题
    Ceph常用维护操作
    linux系统数据落盘之细节
    Ceph: validate that the RBD cache is active
    linux初始化
    GlusterFS 安装
    GlusterFS常用设置命令
    kubernetes --- Glusterfs
    kubernetes --- weave
  • 原文地址:https://www.cnblogs.com/yzwss/p/8686714.html
Copyright © 2011-2022 走看看