zoukankan      html  css  js  c++  java
  • Java——Socket编程(一)

    1. 网络基础知识

    • 两台机器之间需要进行通信,需要满足的条件:
      • 每个机器有一个唯一的标识符(IP地址);
      • 他们之间进行通信需要用同一种语言(协议);
      • 每台主机上面有多个应用程序,如QQ,微博,迅雷等,如何区别是哪个应用程序发出了请求,则需要使用不同的端口号:
        • 端口号范围为:0-65535,其中0-1023为系统所保留;
        • IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础;
        • http: 80; ftp: 21; telnet: 23
    • TCP/IP是目前世界上使用最广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也成TCP/IP协议族或TCP/IP协议栈
      • TCP:Tranmission Control Protocol传输控制协议
      • IP:Internet Protocol互联网协议
      • TCP/IP五层模型:
        • 一。物理层:双绞线,网卡,网线,
        • 二。数据链路层
        • 三。网络层:
        • 四。传输层:TCP/IP协议
        • 五。应用层:HTTP协议,FTP协议,SMTP协议,Telnet远程登录服务等
    • Java对网络编程的支持:
      • InetAddress类:用于标识网络上的硬件资源。
      • URL类:统一资源定位符,通过URL可以直接读取或写入网络上的数据。

      • Sockets:使用TCP协议实现网络通信的Socket相关的类
      • Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信。

    2. InetAddress类:用于标识网络上的硬件资源,表示互联网(IP地址)。

    • 查看Java API得到InetAddress类的方法信息:无构造函数,但是可以通过getByName("主机名/IP地址")返回InetAdress对象;

    3. URL类:统一资源定位符(即网址),通过URL可以直接读取或写入网络上的数据。

    • 由两部分组成:协议名称和资源名称,中间一冒号隔开,如http://www.baidu.com,分别表示http协议和资源名称
    • 使用:多看API
    • public static void main(String[] args) {
              //创建一个URL的实例
              try {
                  URL imooc = new URL("http://www.imooc.com");
                  //?后面表示参数,#后面表示锚点
                  URL url = new URL(imooc, "/index.html?username=tom#test"); 
                  System.out.println("protocol: " + url.getProtocol());
                  System.out.println("host: " + url.getHost());
                  //如果未指定端口号,则使用默认的端口号,此时getPort()方法的返回值为-1
                  System.out.println("port: " + url.getPort());
                  System.out.println("path: " + url.getPath());
                  System.out.println("file: " + url.getFile());
                  System.out.println("Ref: " + url.getRef());
                  System.out.println("DefaultPort: " + url.getDefaultPort());
                  System.out.println("query: " + url.getQuery());
                  try {
                      System.out.println("content: " + url.getContent());
                  } catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              } catch (MalformedURLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              
          }
      View Code
    • 使用URL读取网页内容:通过URL对象的openStream()方法可以得到指定资源的输入流

    4. Socket通信

    • TCP协议是面向连接的,可靠的,有序的,以字节流的方式发送数据
    • 基于TCP协议实现网络通信的类
      • 客户端的Socket类
      • 服务器端的ServerSocket类
      • 实现步骤:
        • 创建ServerSocket和Socket
        • 打开连接到Socket的输入/输出流
        • 按照协议对Socket进行读/写操作
        • 关闭输入输出流,关闭Socket

    4. TCP编程

    • 描述:实现用户的登录。实质就是客户端想服务器端发送信息(用户名和密码),服务器端进行响应。
    • 服务器端:
      • 创建ServerSocket对象,绑定监听端口;
      • 通过accept()方法监听客户端请求;
      • 连接建立后,通过输入流读取客户端发送的请求信息;
      • 通过输出流向客户端发送响应信息;
      • 关闭相应的资源。
    • 客户端:
      • 创建Socket对象,指明需要连接的服务器的地址和端口号;
      • 连接建立后,通过输出流向服务器端发送请求信息;
      • 通过输入流获取服务器响应的信息;
      • 关闭相应的资源。
    • 多线程服务器
      • 应用多线程实现服务器与多客户端之间的通信,基本步骤如下:
        • 服务器端创建ServerSocket,循环调用accept()等待客户端连接
        • 客户端创建一个socket并请求和服务器连接
        • 服务器端接收客户端请求,创建socket与该客户建立专线连接
        • 建立连接的两个socket在一个单独的线程上对话
        • 服务器端继续等待新的连接

    5. UDP编程

    • 描述:UDP连接是无连接的,不可靠的连接。
    • DatagramPacket:表示数据报包;DatagramSocket:进行端到端的通信
    • 服务器端步骤:
      • 创建DatagramSocket,指定端口号
      • 创建DatagramPacket
      • 接收客户端发送的数据信息
      • 读取数据
    • 客户端步骤:
      • 定义发送信息
      • 创建DatagramPacket,包含将要发送的信息
      • 创建DatagramSocket
      • 发送数据

    6. 注意

    • 设置多线程的优先级
    • 是否关闭输出和输入流:对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭socket即可。
    • 使用TCP通信传输对象,通过字符串的形式进行交互,更多的应该是使用对象的方式,可以将它封装成User对象:ObjectOutputStream流。
    • Socket编程传递文件。
  • 相关阅读:
    浅谈MVVM
    组装数据和页面渲染
    Vuejs实现轮播图
    Vuejs选项卡案例
    选项卡案例
    js中用来操作数组的相关的方法
    js中用来操作字符串的相关的方法
    用逗号拼接字符串,并且去掉最后一个逗号
    微信分享链接或网站文章到微信朋友圈,缩略图片不显示,该如何解决?
    Spring 的介绍和目标
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/5407306.html
Copyright © 2011-2022 走看看