zoukankan      html  css  js  c++  java
  • Java基础(一)—— 网络编程(一)—— Java Socket总结

    • 网络基础
      • TCP/IP协议
        • TCP/IP是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也称:TCP/IP协议族 或 TCP/IP协议栈
        • TCP:Transmission Control Protocol 传输控制协议
        • IP:Internet Potocol 互联网协议
        • TCP/IP五层模型 (应用层-传输层-网络层-数据链路层-物理层)
          • 应用层
            • HTTP超文本传输协议
            • FTP文件传输协议
            • SMTP简单邮件传送协议
            • Telnet远程登陆服务
      • 端口
        • 用于区分不同应用程序
        • 端口号范围是 0 ~~ 65525,其中 0 ~~ 1023为系统保留
        • IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
        • 常用的协议使用的端口号 http:80 ftp:21 telnet:23
      • Java中的网络支持
        针对网络通信的不同层次,Java提供的网络功能有四大类
        • InetAddress(用于标识网络上的硬件资源)
        • URL(统一资源定位符,通过URL可以直接读取或写入网络上的数据)
        • Sockets(使用TCP协议实现网络通信的Socket相关的类)
        • Datagram(使用UDP协议,将数据保存在数据报中,通过网络进行通信)
    • InetAddress类
      • InetAddress类代表了一个网络目标地址,包括主机名和数字类型的地址信息。
      • 该类有两个子类,Inet4Address和Inet6Address,分别对应了目前IP地址的两个版本。InetAddress
      • 实例是不可变的,一旦创建,每个实例就始终指向同一个地址。
      • 可以根据IP获取该对象,根据该对象可以获得对应的主机名等等信息
      • InetAddress也可能会被用来将IP地址转变为这些地址的域名,这对于分析Web日志是很有用的。InetAddress使得开发者们可以轻松的和域名、IP地址打交道,并且使他们可以不必和DNS服务器进行交互。
    • URL(Uniform Resource Locator 统一资源定位符 表示Internet上某一资源的地址)
      • URL由两部分组成:协议名称和资源名称,中间用冒号隔开
      • 在java.net包中,提供了URL类来表示URL
      • 利用一个网址获取该网页内容(爬虫抓取)
        public static void printPage(){
                try {
                    URL url = new URL("http://www.baidu.com");
                    InputStream is = url.openStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader br = new BufferedReader(isr);
                    String data = br.readLine();
                    while(data != null){
                        System.out.println(data);
                        data = br.readLine();
                    }
                    br.close();
                    isr.close();
                    is.close();
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }​
    • TCP编程( Socket 实现 TCP 编程)
      • Socket通信
        • TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据
        • 基于TCP协议实现网络通信的类
          • 客户端的Socket类
          • 服务器端的ServerSocket类
        • 实现步骤
          • 创建ServerSocket和Socket
          • 打开连接到Socket的输入/输出流
          • 按照协议对Socket进行读/写操作
          • 关闭输入输出流、关闭Socket
      • Sokect通信模型
        • Server(服务器端)
          public class Service {
              public static void main(String[] args) {
                  try {
                      ServerSocket serverSocket = new ServerSocket(8888);
                      Socket socket = serverSocket.accept();
                      InputStream is = socket.getInputStream();
                      InputStreamReader isr = new InputStreamReader(is);
                      BufferedReader br = new BufferedReader(isr);
                      String info = null;
                      while((info = br.readLine())!=null){
                          System.out.println("服务器,客户端请求:"+info);
                      }
                      socket.shutdownInput();
                      br.close();
                      isr.close();
                      is.close();
                      socket.close();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }

          • 建立连接
            • 建立服务端监听Socket
            • 等待并接收连接请求
            • 接收请求后创建Socket
          • 开始通道
            • InputStream
            • OutputStream
          • 结束通信
            • 关闭Socket及相关资源
        • Client(客户端)
          public class Client {
              public static void main(String[] args) {
                  try {
                      Socket socket = new Socket("localhost",8888);
                      OutputStream os = socket.getOutputStream();
                      PrintWriter pw = new PrintWriter(os);
                      pw.write("用户名:admin;密码:admin");
                      pw.flush();
                      socket.shutdownOutput();
                      pw.close();
                      os.close();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }
          • 创建连接Socket向服务器发送请求
          • OutputStream
          • InputStream
          • 关闭Socket及相关资源
    • UDP编程
      • UDP通信模型
        • 服务端实现步骤
          package org.socket.demo;
          import java.net.DatagramPacket;
          import java.net.DatagramSocket;
          import java.net.InetAddress;
          public class UDPService {
              
              public static void main(String[] args) {
                  try {
                      /**
                       * 接收客户端发送过来的数据信息
                       */
                      //1.创建服务器端DataramSocket,指定端口号
                      DatagramSocket datagramSocket = new DatagramSocket(8800);
                      //2.创建数据报,用于接收客户端发送的数据
                      byte[] data = new byte[1024];//创建字节数组,指定接收的数据包的大小
                      DatagramPacket packet = new DatagramPacket(data,data.length);
                      //3.接收客户端发送的数据
                      datagramSocket.receive(packet);//此方法在接收到数据报之前会一直阻塞
                      //读取数据
                      String info = new String(data,0,packet.getLength());
                      System.out.println("我是服务器,客户端说:"+info);
                      
                      /**
                       * 回应客户端的信息
                       */
                      byte[] data2 = "欢迎您".getBytes();
                      InetAddress inetAddress = packet.getAddress();
                      int port = packet.getPort();
                      DatagramPacket packet2 = new DatagramPacket(data2,data2.length,inetAddress,port);
                      datagramSocket.send(packet2);
                      
                      datagramSocket.close();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  
              }
          }
          • 创建DatagramSocket,指定端口号
          • 创建DatagramPacket,就是创建数据报,用来接收客户端发送的数据
          • 接收客户端发送的数据信息
          • 读取数据
        • 客户端实现步骤
          package org.socket.demo;
          import java.net.DatagramPacket;
          import java.net.DatagramSocket;
          import java.net.InetAddress;
          public class UDPClient {
              public static void main(String[] args) {
                  //1.定义服务器的地址、端口号、数据
                  try {
                      /**
                       * 向服务器端发送请求
                       */
                      InetAddress address = InetAddress.getByName("localhost");
                      int port = 8800;
                      byte[] data = "用户名:admin;密码:123".getBytes();
                      //2、创建数据报,包含发送的数据信息
                      DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
                      //3、创建DatagramSocket对象
                      DatagramSocket socket = new DatagramSocket();
                      socket.send(packet);
                      
                      
                      /**
                       * 接收服务器端发送过来的数据信息
                       */
                      byte[] data2 = new byte[1024];//创建字节数组,指定接收的数据包的大小
                      DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
                      //3.接收客户端发送的数据
                      socket.receive(packet2);//此方法在接收到数据报之前会一直阻塞
                      String info = new String(data2,0,packet2.getLength());
                      System.out.println("我是客户端,服务器说:"+info);
                      
                      socket.close();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }
          • 定义发送信息
          • 创建DatagramPacket,包含将要发送的信息
          • 创建DatagramSocket
          • 发送数据
    • Socket总结
      • 是否关闭输入/输出流
        • 对于同一个Socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭Socket即可
      • 多线程的优先级
        • 未设置优先级可能会导致运行时速度非常慢,可降低优先级提高运行速率
      • 使用TCP通信传输对象
        • ObjectOUTputStream, writeObject()---->传输的对象必须实现序列化接口,implements Serializable,否则报异常
          Socket socket = new Socket("localhost",8888);
          OutputStream os = socket.getOutputStream();
          ObjectOutputStream oos = new ObjectOutputStream(os);
          User user = new User("amdin","123");
          oos.writeObject(user);
          socket.shutdownOutput();
        • ObjectInputStream,readObject()
          InputStream is = socket.getInputStream();
          ObjectInputStream ois = new ObjectInputStream(is);
          User user = (User)ois.readObject();
          System.out.println(user.getUsername()+"	"+user.getPassword());
          socket.shutdownInput();
      • soket编程传递文件
    • 资料文献书籍
      • IP地址:《探索Linux的网络世界》
  • 相关阅读:
    PythonIDE
    Python学习笔记六:return的用法
    Python学习笔记三:逻辑操作符
    Python编程实现对CodeSys中ST代码的自动排版(一)
    Python学习笔记十二:列表(4)len 、in、For的使用
    Python学习笔记七:字符串的操作(一)
    Python学习笔记五:while语句
    Python编程实现对CodeSys中ST代码的自动排版(二)
    Python学习笔记十:列表(2)列表元素的读写
    Python学习笔记九:列表(1)列表元素介绍及创建方法
  • 原文地址:https://www.cnblogs.com/myfaith-feng/p/9665979.html
Copyright © 2011-2022 走看看