网络编程:UDP传输和TCP传输

一、概述

1、计算机网络 

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

2、网络编程       

就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。

3、网络模型

计算机网络之间以何种规则进行通信,就是网络模型研究问题。

网络模型一般是指         OSI(Open System Interconnection开放系统互连)参考模型  (要记住)     

                                     TCP/IP参考模型(HTTP/HTTP)

 网络模型7层概述:

1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

2. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。

3. 网络层:主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。

4. 传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。

5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)

6.表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等)。

7.应用层: 主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西.就是终端应用)。

4、网络通信三要素(ip地址,端口号、传输协议)

(1)IP地址:网络中设备的标识,不易记忆,可用主机名

IP地址的组成:网络号段 + 主机号段
IP地址的分类:
    A:第一个号段定义为网络号段 + 后面三个号段都是为主机号段
        可以有多少台主机相连:256*256*255
    B:前两个号段为网络号段 + 后两个号段为主机号段   256*255
    C:前三个号段都为网路号段 + 最后一个号段为主机号段  255 局域网
    D:224.0.0.1---239.255.255.254
    E:240.0.0.1---247.255.255.254

特殊的IP地址:
    1、loaclhost = 本机 = 127.0.0.1
        127.0.0.1 回环地址,可以用于测试本机的网络是否有问题,ping 127.0.0.1

    2、广播地址:
        x.x.x.255

    3、网络地址:
        x.x.x.0

三个DOS命令:
    ipconfig Windows: 查看ip地址
    Linux:
        centOS6:ifconfig
        centOS7:ip addr

    ping:测试网络是否联通
        ping + IP地址/host名

/*
        为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用

        public static InetAddress getByName(String host)
                             throws UnknownHostException确定主机名称的IP地址。
 */
public class InetAddressDemo {
    public static void main(String[] args) throws Exception {
        InetAddress name = InetAddress.getByName("192.168.7.25");
        System.out.println(name);

        //public String getHostName()根据给出的此电脑的IP地址获取主机名
        String hostName = name.getHostName();
        System.out.println(hostName);

        //public String getHostAddress()返回文本显示中的IP地址字符串。
        String address = name.getHostAddress();
        System.out.println(address);
        
    }
}
/192.168.7.25
LAPTOP-LN80BBVU
192.168.7.25

(2)端口号

物理端口 网卡口

逻辑端口 我们指的就是逻辑端口     

A:每个网络程序都会至少有一个逻辑端口     

B:用于标识进程的逻辑地址,不同进程的标识     

C:有效端口:0~65535,其中0~1024系统使用或保留端口。     

通过netstat  -ano可以查看端口号

(3)传输协议

通讯的规则

常见的协议UDP和TCP

UDP   将数据源和目的封装成数据包中,不需要建立连接;每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快

TCP    建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

5、Socket

(1)Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

(2)Socket原理机制: 通信的两端都有Socket。 网络通信其实就是Socket间的通信。 数据在两个Socket间通过IO传输

 6、UDP传输(先运行接受,在运行发送)

 UDP协议发送数据:
          1、创建发送端的Socket对象
          2、创建数据,并把数据打包
          3、调用Socket对象的发送方法将数据发送出去
          4、释放资源,关闭Socket

public static void main(String[] args) throws Exception{
        //1、创建发送端的Socket对象 DatagramSocket
        //DatagramSocket()
        //构造数据报套接字并将其绑定到本地主机上的任何可用端口。
        DatagramSocket ds = new DatagramSocket();
        //2、创建数据,并把数据打包
        byte[] bytes = "你好,大数据".getBytes();
        //获取数组的长度
        int length = bytes.length;
        //要发送的IP地址
        InetAddress address = InetAddress.getByName("192.168.7.42");
        //设置端口号
        int port = 10086;
        //3、调用Socket对象的发送方法将数据发送出去
        //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
        //构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
        DatagramPacket packet = new DatagramPacket(bytes, length, address, port);
        //从此套接字发送数据报包。
        //void send(DatagramPacket p)
        ds.send(packet);

        //4、释放资源,关闭Socket
        ds.close();
    }
UDP协议接收数据:
   1、创建接收端的Socket对象
   2、创建一个数据包(接收容器)、
   3、调用Socket对象的接收方法接收数据
   4、解析数据包,得到数据并显示在控制台上
   5、释放资源,关闭Socket
public static void main(String[] args) throws Exception {
        //1、创建接收端的Socket对象
        //DatagramSocket(int port)
        //构造数据报套接字并将其绑定到本地主机上的指定端口。
        DatagramSocket ds = new DatagramSocket(10086);

        //2、创建一个数据包(接收容器)
        //定义个字节数组
        byte[] bytes = new byte[1024];
        int length = bytes.length;
        //DatagramPacket(byte[] buf, int length)
        //构造一个 DatagramPacket用于接收长度的数据包 length 。
        DatagramPacket datagramPacket = new DatagramPacket(bytes, length);

        //3、调用Socket对象的接收方法接收数据
        ds.receive(datagramPacket); //程序阻塞,直到接收到数据

        InetAddress address = datagramPacket.getAddress();
        String ip = address.getHostAddress();

        //4、解析数据包,得到数据并显示在控制台上
        //public byte[] getData()返回数据缓冲区。
        byte[] data = datagramPacket.getData();
        //public int getLength()返回要发送的数据的长度或接收到的数据的长度。
        int length1 = datagramPacket.getLength();
        String s = new String(data, 0, length1);
        System.out.println(ip + "发送的数据为:" + s);

        //释放资源,关闭Socket
        ds.close();


    }

7、TCP传输(要先启动服务器端,再启动客户端,否则会报连接被拒绝异常)

TCP协议客户端代码实现:
    1、创建客户端的Socket对象
        这一步如果成功创建对象,就说明连接已经建立成功
    2、获取输出流对象,向服务器写数据
    3、释放资源,关闭Socket服务

public static void main(String[] args) throws Exception {

        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);

        //创建发送端的Socket对象
        //Socket(String host, int port)
        //创建流套接字并将其连接到指定主机上的指定端口号。
        Socket s = new Socket("192.168.7.25", 12345);

        //获取输出流对象,想服务器写数据
        OutputStream os = s.getOutputStream();

        while (true){
            String next = sc.next();

            if("886".equals(next)){
                break;
            }

            os.write(next.getBytes());
        }

        //释放资源,关闭Socket服务
        s.close();
    }
}

TCP协议编写服务器端代码:
          1、创建服务器端Socket对象(ServerSocket)
          2、调用accept()方法,监听客户端的连接,返回一个对应客户端连接的Socket对象
          3、获取通道中的输入流对象,读取客户端发送的数据,并显示在控制台上
          4、释放资源,关闭Socket服务

public static void main(String[] args) throws Exception {
        //1、创建服务器端Socket对象(ServerSocket)
        //ServerSocket(int port)
        //创建绑定到指定端口的服务器套接字。
        ServerSocket ss = new ServerSocket(12345);

        //调用accept()方法,监听客户端的连接,返回一个对应客户端连接的Socket对象
        Socket s = ss.accept();

        while (true){
            //获取通道中的输入流对象
            InputStream inputStream = s.getInputStream();
            byte[] bytes = new byte[1024];
            int length = inputStream.read(bytes);
            String s1 = new String(bytes, 0, length);

            //获取客户端的ip
            String ip = s.getInetAddress().getHostAddress();
            String hostName = s.getInetAddress().getHostName();
            System.out.println(ip+":"+hostName+"发送的数据为:"+s1);
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值