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的网络世界》
原文地址:https://www.cnblogs.com/myfaith-feng/p/9665979.html