网络编程

文章目录

1. 网络通信要素概述

  • 通信双方的地址
    1. IP
    2. 端口号
  • 一定的规则
    • OSI参考模型
    • TCP/IP参考模型 事实上的标准

2. 通信要素1-IP和端号

2.1 IP地址

  • 唯一地表示Internet上的计算机
  • 本地回环地址:127.0.0.1 主机名: localhost
  • IPV4: 4个字节组成,32位
  • IPV6:16个字节组成,128位
  • 公网地址—万维网使用
  • 私有地址—局域网使用,为组织机构内部使用 192.168开头

2.2 端口号

  • 不同的进程有着不同的端口号
  • 端口号是一个16位的整数 0~65535
  • 端口分类
    1. 公认端口:0~1023 被服务通信占用 比如HTTP 80 FTP 21 Telnet 23
    2. 注册端口 :分配给用户进程或应用程序 Tomcat 8080 MySQL 3306 Oracle 1521
    3. 动态/私有端口:49152~65535
  • InetAddress没有提供公共的构造器,但是提供了如下几个静态方法来获取InetAddress实例
package javabasis.chapter14;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressTest {
    public static void main(String[] args) throws UnknownHostException {
       InetAddress address_1=InetAddress.getByName("www.baidu.com");
       System.out.println(address_1);
       //获取InetAddress 对象所含的域名
       System.out.println(address_1.getHostName());
       //获取InetAddress 对象所含的IP地址
       System.out.println(address_1.getHostAddress());

       //获取本机的IP地址
       InetAddress address_2=InetAddress.getLocalHost();
       System.out.println(address_2);      
    }
}

3.通信要素2-网络协议

  • 两个重要的协议
    1. 传输快指协议TCP
    2. 用户数据包协议UDP
  • TCP
    1. 使用前需要先简历TCP连接
    2. 传输前采用三次握手,点对点通信,可靠
    3. 用于客户端和服务端
    4. 四次握手释放连接,效率较低
  • UDP
    1. 封装成数据包,不需要建立连接
    2. 每个数据包的大小限制在64K内
    3. 接收方不确认,不可靠
    4. 可以广播发送
    5. 结束时不需要释放资源,开销小,速度快
  • Socket
    1. 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字
    2. 通信的两端都需要由Socket
    3. 网络通信其实就是Socket间的通信
  • Socketf分类
    1. 流套接字:使用TCP提供可靠的字节流服务
    2. 数据报套接字,使用UDP提供“尽力而为”的服务

4.TCP网络编程

4.1 基于Socket的TCP编程

  • 客户端:

    1. 创建Socket
    2. 打开连接到Socket的输入/输出流
    3. 按照一定的协议对Socket进行读/写操作
    4. 关闭Socket
  • 服务器端

    1. 调用ServerSocket(int port)
    2. 调用accept()
    3. 调用该Socket对象的getOutputStream和getInputStream,获取输出流和输入流 字节流
    4. 关闭ServerSocket和Socket对象
  • 常用方法

    1. public Socket(InetAddress address,int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号
    2. public Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号
    3. public InputStream getInputStream()返回此套接字的输入流。可以用于接收网络消息
    4. public OutputStream getOutputStream()返回此套接字的输出流。可以用于发送网络消息
    5. public void close()关闭此套接字
    package javabasis.chapter14;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class Client {
        public static void main(String[] args) throws IOException {
            Socket socket=new Socket("127.0.0.1",8888);//指定IP地址和端口号,服务器端端口号应一致
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("Hello Server!".getBytes());
            InputStream inputStream = socket.getInputStream();
            byte[] bytes=new byte[1024];
            int read = inputStream.read(bytes);
            System.out.println(new String(bytes, 0, read));
            socket.close();
        }
    }
    
    package javabasis.chapter14;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {//服务器端必须先建立一个套接字对象来等待客户请求
        public static void main(String[] args) throws IOException {
            ServerSocket server = new ServerSocket(8888);//监听客户端的请求
            Socket accept = server.accept();
            InputStream inputStream = accept.getInputStream();
            byte[] bytes = new byte[1024];
            int read = inputStream.read(bytes);
            System.out.println(new java.lang.String(bytes, 0, read));
            OutputStream outputStream = accept.getOutputStream();
            outputStream.write("Server has got it!".getBytes());
            accept.close();
            server.close();
        }
    }
    
    
    

5.UDP网络编程

  • 类DatagramSocket和DatagamPacket实现了基于UDP的协议网络程序

  • 常用方法

    1. public DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口
    2. public DatagramSocket(int port,InetAddress laddr)创建数据报套接字,将其绑定到指定的本地地址
    3. public void close()关闭此数据报套接字
    4. public void send(DatagramPacket p)从此套接字发送数据报包
    5. public void receive(DatagramPacket p)从此套接字接收数据报包
    6. public DatagramPacket(byte[] buf,int length)构造 DatagramPacket,用来接收长度为 length 的数据包。
    7. public DatagramPacket(byte[] buf,int length,InetAddress address,int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
    package javabasis.chapter14;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class Client {
        public static void main(String[] args) throws IOException {
             DatagramSocket ds=null;
             try {
                 ds=new DatagramSocket();
                 byte [] by="hello world".getBytes();
                 DatagramPacket dp=new DatagramPacket(by, 0,by.length,InetAddress.getByName("127.0.0.1"),10000);
                 ds.send(dp);
    
             } catch (Exception e) {
                e.printStackTrace();
             }finally{
                 if(ds!=null)
                 ds.close();
    
             }
        }
    }
    
    
    
    package javabasis.chapter14;
    
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) throws IOException {
            DatagramSocket ds=null;
            try {
                ds=new DatagramSocket(10000);
                byte [] by=new byte[1024];
                DatagramPacket dp=new DatagramPacket(by, by.length);
                ds.receive(dp);
                String str=new String(dp.getData(),0,dp.getLength());
                System.out.println(str+"--"+dp.getAddress());
            } catch (Exception e) {
               e.printStackTrace();
            }finally{
                if(ds!=null)
                ds.close();
            }
        }
    }
    
    
    
    
    
    
    
    

网络编程

上一篇:Java网络编程


下一篇:Web 安全之 XSS 攻击与防御