网络编程TCP和UDP介绍与使用

链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。

网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。

传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。

应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。

InetAdderss类

 

InetAddress local = InetAddress.getLocalHost();

        InetAddressremote = InetAddress.getByName("www.itcast.cn");

        System.out.println("本机的IP地址:" + local.getHostAddress());

        System.out.println("itcast的IP地址:" + remote.getHostAddress());

        System.out.println("itcast的主机名为:" + remote.getHostName());

UDP协议
     a:UDP协议概述:
      UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。
      简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
     b:UDP协议特点:
      由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,

      因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

TCP协议
    TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
    在TCP连接中必须要明确客户端与服务器端,
      由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。
      第一次握手,客户端向服务器端发出连接请求,等待服务器确认
      第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

      第三次握手,客户端再次向服务器端发送确认信息,确认连接

UDP通信:

UDP发送端
         /*
        *  实现UDP协议的发送端:
        *    实现封装数据的类 java.net.DatagramPacket  将你的数据包装
        *    实现数据传输的类 java.net.DatagramSocket  将数据包发出去
        *    
        *  实现步骤:
        *    1. 创建DatagramPacket对象,封装数据, 接收的地址和端口
        *    2. 创建DatagramSocket
        *    3. 调用DatagramSocket类方法send,发送数据包
        *    4. 关闭资源
        *    
        *    DatagramPacket构造方法:
        *      DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
        *      
        *    DatagramSocket构造方法:
        *      DatagramSocket()空参数
        *      方法: send(DatagramPacket d)

        * 

 

 

/*

* 发送端

 * 1,创建DatagramSocket对象

 * 2,创建DatagramPacket对象,并封装数据

 * 3,发送数据

 * 4,释放流资源

 */

 

 

 

publicclass UDPSend {

    public static void main(String[] args) throwsIOException {

        //1,创建DatagramSocket对象

        DatagramSocket sendSocket = new DatagramSocket();

        //2,创建DatagramPacket对象,并封装数据

        //public DatagramPacket(byte[] buf,int length, InetAddress address,  intport)

        //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

        byte[] buffer = "hello,UDP".getBytes();

        DatagramPacket dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("192.168.75.58"), 12306);

        //3,发送数据

        //public void send(DatagramPacket p) 从此套接字发送数据报包

        sendSocket.send(dp);

        //4,释放流资源

        sendSocket.close();

    }

}

/*

 * UDP接收端

 *

 * 1,创建DatagramSocket对象

 * 2,创建DatagramPacket对象

 * 3,接收数据存储到DatagramPacket对象中

 * 4,获取DatagramPacket对象的内容

 * 5,释放流资源

 */

publicclass UDPReceive {

    publicstaticvoid main(String[] args) throws IOException {

        //1,创建DatagramSocket对象,并指定端口号

        DatagramSocket receiveSocket = new DatagramSocket(12306);

        //2,创建DatagramPacket对象, 创建一个空的仓库

        byte[] buffer = newbyte[1024];

        DatagramPacket dp = new DatagramPacket(buffer,1024);

        //3,接收数据存储到DatagramPacket对象中

        receiveSocket.receive(dp);

        //4,获取DatagramPacket对象的内容

        //谁发来的数据  getAddress()

        InetAddress ipAddress = dp.getAddress();

        String ip = ipAddress.getHostAddress();//获取到了IP地址

        //发来了什么数据  getData()

        byte[] data = dp.getData();

        //发来了多少数据 getLenth()

        intlength = dp.getLength();

        //显示收到的数据

        String dataStr = new String(data,0,length);

        System.out.println("IP地址:"+ip+ "数据是"+ dataStr);

        //5,释放流资源

        receiveSocket.close();

    }

}

TCP

 

 * TCP 服务器端

 *

 * 1,创建服务器ServerSocket对象(指定服务器端口号)

 * 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

 * 3,给客户端反馈信息

 * 4,关闭流资源

 */

publicclass TCPServer {

    publicstaticvoid main(String[] args) throwsIOException {

        //1,创建服务器ServerSocket对象(指定服务器端口号)

        ServerSocket ss = newServerSocket(8888);

        //2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

        Socket s = ss.accept();

        //3,给客户端反馈信息

        /*

         * a,获取客户端的输出流

         * b,在服务端端,通过客户端的输出流写数据给客户端

         */

        //a,获取客户端的输出流

        OutputStreamout = s.getOutputStream();

        //b,在服务端端,通过客户端的输出流写数据给客户端

        out.write("你已经连接上了服务器".getBytes());

        //4,关闭流资源

        out.close();

        s.close();

        //ss.close();  服务器流通常都是不关闭的

    }

}

 

完成了服务器端程序的编写,接下来编写客户端程序。

/*

 * TCP 客户端

 *

 * 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)

 * 2,获取服务器端的反馈回来的信息

 * 3,关闭流资源

 */

publicclass TCPClient {

    publicstaticvoid main(String[] args) throws IOException{

        //1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)

        Socket s = new Socket("192.168.74.58", 8888);

        //2,获取服务器端的反馈回来的信息

        InputStream in = s.getInputStream();

        //获取获取流中的数据

        byte[] buffer = newbyte[1024];

        //把流中的数据存储到数组中,并记录读取字节的个数

        int length = in.read(buffer);

        //显示数据

        System.out.println( newString(buffer, 0 , length) );

        //3,关闭流资源

        in.close();

        s.close();

    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值