网络通信协议UDP,TCP

网络编程三要素
       协议        IP地址        端口号

协议

协议
             计算机之间进行数据传输需要遵守的规则
             UDP:
                面向无连接的通信协议,两台计算机进行数据传输不需要建立连接,
                发送端给接收端发送数据 不会确认接收端是否存在 接收端接收到数据 也不会告知发送端

特点
                    两台计算机不需要建立连接 ,消耗资源少,发送效率高,但是每次发送的最大不能超过64KB
                    不保证数据的完整性
             TCP:
                 面向连接的通信协议,客户端与服务端必须建立连接,可以保证两台计算机之间可靠的无差错的数据传输.

                 客户端 -----> 服务端
                 客户端 <----- 服务端
                 客户端 -----> 服务端

                 特点
                     必须建立连接,消耗资源多,发送效率低,但是每次发送数据没有限制,可以保证数据的完整性

                     上传与下载一定使用TCP协议

  IP地址

查看本机ip
 ipconfig

查看网络是否能够连通

ping  ip地址
 ping  网址

特殊的ip
127.0.0.1

localhost

端口号

如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
            取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用
            普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

java.net.InetAddress        ip地址

        静态方法创建对象

static InetAddress getLocalHost()  返回本地主机的ip地址对象
static InetAddress getByName(String ip) 根据ip获取到ip地址对象  ip可以是网址 也可以是ip地址 也可以是主机名

UDP

UDP发送端
              java.net.DatagramSocket
                     构造方法
                          public DatagramSocket()  发送端
                     方法
                         send(DatagramPacket dp)  发送数据包

              java.net.DatagramPacket
                      构造方法
                          DatagramPacket(byte[] buf, int length, InetAddress address, int port)
                                  发送端数据包 封装 数据  接收端地址 接收端端口

public class UDPSend {
    public static void main(String[] args) throws IOException {
        //  1.创建发送端对象
        DatagramSocket ds = new DatagramSocket();

        //  2.创建数据包对象 封装数据 接收端地址 接收端的端口
        byte[] bytes = "hello,UDP!".getBytes();
        //接收端的ip地址对象
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        //端口号
        int port = 5555;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,ip,port);

        // 3.调用发送端对象的send方法 发送数据包
        ds.send(dp);

        //关闭资源
        ds.close();
    }
}

UDP接收端
              构造方法
                   public DatagramSocket(int port) 创建接收端绑定端口号
              方法
                 void receive(DatagramPacket p)  接收数据包


       java.net.DatagramPacket
              构造方法
                  DatagramPacket(byte[] buf, int length) 接收端数据包

public class UDPReceive {
    public static void main(String[] args) throws IOException {
        //1.创建接收端对象
        DatagramSocket ds = new DatagramSocket(5555);

        //2.创建数据包对象
        byte[] bytes = new byte[1024*64];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        // 3.接收端对象调用 receive方法 接收数据包
        ds.receive(dp);

        // 4.拆包
        int length = dp.getLength(); //获取发送过来数据的长度
        InetAddress ip = dp.getAddress(); //获取发送端的ip地址
        int port = dp.getPort(); //获取发送端发送数据的端口号
        System.out.println(ip+":"+port+" "+new String(bytes,0,length));

        ds.close();
    }
}

TCP

java.net.Socket   客户端
          构造方法
              public Socket(String ip,int port) 绑定服务端ip和端口
              public Socket(InetAddress ip ,int port)

          方法
               public  OutputStream getOutputStream() 获取字节输出流
               public InputStream getInputStream() 获取字节输入流

public class TCPClient {
    public static void main(String[] args) throws IOException {
        // 1.创建客户端对象
        Socket s = new Socket("127.0.0.1",6666);
        // 2.获取字节输出流对象
        OutputStream out = s.getOutputStream();
        // 3.使用字节输出流向服务端写数据 "你好"
        out.write("你好".getBytes());

        System.out.println("-------------接收服务器返回的数据---------------");
        // 4.获取字节输入流对象
        InputStream in = s.getInputStream();
        // 5.接收服务器返回的数据 
        byte[] bytes = new byte[1024];
        int len = in.read(bytes);
        System.out.println(new String(bytes,0,len));
        // 6.关闭资源
        in.close();
        out.close();
        s.close();
    }
}

java.net.ServerSocket 服务端
            构造方法
                 public ServerSocket(int port) 创建服务端对象 绑定端口号

            方法
                 Socket accept()  接收正在连接的客户端对象  具有阻塞功能

public class TCPServer {
    public static void main(String[] args) throws IOException {
        // 1.创建服务端对象
        ServerSocket ss = new ServerSocket(6666);
        //2.调用accept方法接收正在连接的客户端对象
        Socket s = ss.accept();
        // 3.获取字节输入流对象
        InputStream in = s.getInputStream();
        // 4.接收当前客户端发送过来的数据  "你好"
        byte[] bytes = new byte[1024];
        int len = in.read(bytes);
        System.out.println(new String(bytes,0,len));
        System.out.println("---------------向客户端返回数据-------------------");
        // 5.获取字节输出流对象
        OutputStream out = s.getOutputStream();
        // 6.给客户端返回数据
        out.write("大家好".getBytes());
        // 7.关闭资源
        out.close();
        in.close();
        s.close();
        ss.close();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值