`
把阳光剪成雨Java
  • 浏览: 25257 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

黑马程序员——网络编程概述和UDP

 
阅读更多

----------------- android培训,java培训、期待与您交流! --------------------

 

网络编程

1.网络编程概述

       网络的模型OSI模型,TCP/IP参考模型。网络通讯要素:ip地址,端口号,传输协议。也就是说,我想和某台机器进行网络的通讯,第一,必须知道你要通讯的机器在哪(IP);第二,计算机上有多个应用程序。你想要和计算机上的哪个应用程序进行通讯,需要明确指定应用程序。(端口);第三,通过一二两个步骤,把基本的通讯通道搭建完成了。在通讯过程中,可以有多种通用通讯规则。你需要明确指定一种通讯的规则完成通讯,如果两者的协议不同不能进行通讯。(传输协议,国际通用TCP/IP)。

端口号的范围:065535,0-1024一般被系统的应用程序占用了。

2.网络模型

    OSI参考模型:应用层,表示层,会话层,传输层,网络层,链路层,物理层。数据传递过程中经过的那么多层,相当于给数据一层一层地套上外衣(数据封包)。传到另外一台机器上的时候,从底层往上层对应地一层一层脱衣服(数据拆包),最后会到应用层。当应用层拆完数据包后,就会收到传递来的数据。

    TCP/IP参考模型(对OSI参考模型进行了简化):应用层(应用层,表示层,会话层),传输层,网际层(网络层),主机至网络层(数据链路层,物理层)。

    现在学的是传输层(因为做软件,通过软件来发送数据,协议是tcp/udp)。而web应用程序,属于应用层(协议是http,ftp等)。网络层的协议是:ip

3.网络通讯要素

    IP地址:网络中的设备标示。不易记忆,可用主机名。本地回还地址:127.0.0.1 主机名:localhost。在java语言中提供了方便操作的IP对象InetAddress。关于网络编程的对象java.net包中。代码示例:

//获取本地的的InetAddress包含了主机名字,和ip地址。(重点掌握)

       InetAddress ia1 = InetAddress.getLocalHost();

       System.out.println(ia1);

//     通过主机名字来获取InetAddress,(重点掌握)

       InetAddress ia2 = InetAddress.getByName("www.baidu.com");

       System.out.println(ia2.toString());

//     通过主机名字来获取所有的InetAddress

       InetAddress[] ia3 = InetAddress.getAllByName("www.baidu.com");

       System.out.println(ia3.length);

       for(InetAddress ip :ia3){

           System.out.println(ip.getHostAddress());

           System.out.println(ip.getHostName());

          

       }

//     toString() = getHostAddress()(重点掌握)+getHostName()

    端口号:用于标识进程的逻辑地址,不同进程的标识。有效端口号是:0~65535,其中0~1024系统使用或保留端口。端口没有提供对象,因为它就是一个整数。

 

    传输协议:通讯的规则,常见的有TCP/UDP。提供了相对应的对象。

    (重点)TCPUDP的区别:

UDP:

A,将数据以及源和目的封装在数据包中,不需要建立连接。B,每个数据报的大小限制在64k内。C,因为无连接,是不可靠的协议。D,不需要建立连接,速度快。(生活中相当于到邮局寄东西,地址(IP),具体人(端口))。聊天udp,视频直播软件,qq,求速度的软件一般都是udp

TCP:

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

例:下载。

 

4Socket

Socket就是为网络服务提供的一种机制。通信的两端都有Socket。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。

 

 

 

5UDP的发送端

1.  建立udpsocket服务。(邮局)

2.  提供数据,并将数据封装到数据包中。(寄的东西,数据,地址,端口)

3.  通过socket服务的发送功能,将数据包发出去。(将已有的数据包发送出)

4.  关闭资源。

5.代码示例:

package net;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;

public class UdpSend {

    public static void main(String[] args) {

       // 1.创建udpsocket服务。不指定发送端的具体端口号,让系统默认产生,也可以自定义。

       DatagramSocket sendSocket = null;

       try {

           sendSocket = new DatagramSocket();

           // 2.创建数据包,将要发送的数据和发送的地址以及端口号,写入包中。

           byte[] buf = "itheima".getBytes();

           DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress

                  .getByName("localhost"), 12345);

           // 3.将数据包通过socket发送出去。

           sendSocket.send(dp);

       } catch (SocketException e) {

           e.printStackTrace();

       } catch (UnknownHostException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

        // 4.关闭资源

       finally {

           if (sendSocket != null) {

              sendSocket.close();

           }

       }

    }

}

 

6.UDP的发送端

1.  定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标示。方便于明确哪些数据过来该应用程序可以处理。

2.  定义一个数据包,因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。

3.  通过socket服务的receive方法将要收到的数据存入已经定义好的数据包中。

4.  通过数据包对象的特有功能。将这些不同的数据取出。

5.  关闭资源。

6.  代码示例:

package net;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.SocketException;

public class UdpReceive {

    public static void main(String[] args) {

       // 1.创建接收端的udpsocket,并监听一个端口用来匹配发送端指定的端口

       DatagramSocket ds = null;

       try {

           ds = new DatagramSocket(12345);

//         2.创建一个数据包用来存储发送端发来的数据包。

           byte[] buf = new byte[1024];

           DatagramPacket dp = new DatagramPacket(buf,buf.length);

//         3.调用DatagramSocketrecieve方法,来接收发送端发来的数据。

           ds.receive(dp);

//         4.dp已经接收到发来的额数据包,通过dp获取数据包中的数据。

           String hostName = dp.getAddress().getHostName();

           String ip = dp.getAddress().getHostAddress();

           String data = new String(dp.getData(),0,dp.getLength());

           int port = dp.getPort();       

           System.out.println(hostName+"...."+ip+"...."+data+"...."+port);

       } catch (SocketException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

//     关闭资源

       finally{

           if(ds!=null){

              ds.close();

           }

       }

    }

}

 

7.UDP的键盘录入方式

用键盘录入的方式实现对讲机功能,代码如下:

发送端:package net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

public class UdpSend2 {

    public static void main(String[] args) {

       DatagramSocket ds = null;

       try {

           // 创建udpsendsocket服务

            ds = new DatagramSocket();

           // 键盘输入,并读取键盘数据

           BufferedReader br = new BufferedReader(new InputStreamReader(

                  System.in));

           String line = null;

           while ((line = br.readLine()) != null) {

//            键盘录入"886“时候,跳出循环,程序停止。并将socket关闭

              if(line.equals("886"))

                  break;

//            将键盘录入的数据封装到了一个数据包里

              byte[] buf = line.getBytes();

              DatagramPacket dp = new DatagramPacket(buf, buf.length,

                     InetAddress.getByName("localhost"), 12345);

//         发送数据包

              ds.send(dp);

           }

       } catch (SocketException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }finally{

           if(ds!=null)

              ds.close();

       }

    }

}

发送端:package net;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.DatagramSocketImpl;

import java.net.SocketException;

 

public class UdpReceive2 {

    public static void main(String[] args) {

       // 建立udpreceivesocket接收端,并监听端口。不能关闭,因为关闭之后就无法再接收到发来的内容。

       DatagramSocket ds=null;

       try {

            ds = new DatagramSocket(12345);

       } catch (SocketException e) {

           e.printStackTrace();

       }

      

       while (true) {

           // 定义数据包接收数据。

           byte[] buf = new byte[1024*64];

           DatagramPacket dp = new DatagramPacket(buf, buf.length);

           //接收数据,将接受的数据存储在dp中。

           try {

              ds.receive(dp);

//         dp中获得数据,並打印。

               String ip = dp.getAddress().getHostAddress();

              String data = new String(dp.getData(),0,dp.getLength());

              System.out.println(ip+":"+data);

           } catch (IOException e) {

              e.printStackTrace();

           }

       }

   

    }

}

 

8.UDP聊天

package net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

 

public class UdpQQ {

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

       DatagramSocket sendds = new DatagramSocket();

       DatagramSocket recds = new DatagramSocket(10002);

       new Thread(new Send(sendds)).start();

       new Thread(new Rec(recds)).start();

       // new Thread(new Send(new DatagramSocket())).start();

       // new Thread(new Rec(new DatagramSocket(10002))).start();

    }

}

 

// 想要在一个进程里面既可以发数据也可以接收数据,那么就用到多线程技术。

class Send implements Runnable {

    private DatagramSocket sendDs;

 

    public Send(DatagramSocket ds) {

       this.sendDs = ds;

    }

 

    @Override

    public void run() {

       try {

           // 建立socket服务。

 

           // 从键盘读取数据,并把数据封装到数据包中,发送给接收端。

           BufferedReader br = new BufferedReader(new InputStreamReader(

                  System.in));

           String line = null;

           while ((line = br.readLine()) != null) {

              if (line.equals("886"))

                  break;

              byte[] buf = line.getBytes();

 

              DatagramPacket dp = new DatagramPacket(buf, buf.length,

                     InetAddress.getByName("localhost"), 10002);

 

              sendDs.send(dp);

 

           }

       } catch (SocketException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       } finally {

           if (sendDs != null)

              sendDs.close();

       }

    }

 

}

 

class Rec implements Runnable {

    private DatagramSocket recDs;

 

    public Rec(DatagramSocket ds) {

       this.recDs = ds;

    }

 

    @Override

    public void run() {

       try {

           // 创建一个接收端的socket服务。

 

           while (true) {

              // 定义一个数据包用来接收发来的数据。

              byte[] buf = new byte[1024 * 64];

              DatagramPacket dp = new DatagramPacket(buf, buf.length);

              // 接收数据。

              recDs.receive(dp);

              // 获得数据包中的数据。

              String ip = dp.getAddress().getHostAddress();

              String data = new String(dp.getData(), 0, dp.getLength());

              System.out.println(ip + "::" + data);

           }

       } catch (SocketException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

    }

 

}

总结:

如果想要把发送端和接收端不在同一个窗口中输入和输出。其实,平时的(我和你)qq聊天的原理是:1,我上面有一个DatagramSocket发送端,发送数据的时候发送了两次。一个往你上面发(数据包指向本地地址和端口号),一个往自己本地上发(数据包指向你地址和端口号)。2,我上面有一个DatagramSocket接收端,接收数据既有你的信息,又有我的信息。3,你上面和我上面得同理。4,不管你还是我,涉及到的所有端口号必须是一样的。

 

 

分享到:
评论

相关推荐

    黑马程序员-Qt讲义.pdf

    Socket通信是网络编程中不可或缺的技术,Qt支持基于TCP/IP协议的客户端和服务器端编程,以及UDP通信和组播技术。 多线程是现代应用程序中用来提高性能的重要技术。Qt提供了多线程编程的支持,包括线程的基本概念...

    linux C语言 网络编程教程及源码

    2、Linux网络编程02——无连接和面向连接的区别 3、Linux网络编程03——字节序和地址转换 4、Linux网络编程04——套接字 5、Linux网络编程05——C/S与B/S架构的区别 6、Linux网络编程06——UDP协议编程 7、Linux网络...

    黑马程序员基础测试题答案

    4、 什么情况下适合用UDP协议,什么情况下适合用TCP协议? 5、 throw和throws有什么区别? try、catch、finally分别在什么情况下使用? 6、 声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用...

    NetWork网络编程TCP和UDP源代码

    在IT领域,网络编程是构建分布式系统和网络应用程序的基础,其中TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的网络传输层协议。本资源包含"NetWork网络编程TCP和UDP源代码",是学习和实践这两种协议的...

    socket网络(UDP协议编程)

    "socket网络(UDP协议编程)"这个标题明确指出了我们要讨论的核心内容——使用套接字(socket)进行网络编程,并且聚焦在用户数据报协议(UDP)上。UDP是一种无连接的、不可靠的传输层协议,与TCP(传输控制协议)...

    QT网络编程——UDP通信源码

    此外,对于UDP通信,我们还需要了解网络编程的一些基础知识,如IP地址和端口的概念,以及端口的复用和多播等高级特性。在QT中,QUdpSocket还支持多播功能,通过加入多播组可以实现一对多的数据广播。 总的来说,QT...

    socket 网络编程 TCP协议UDP协议传输

    总之,socket网络编程结合TCP和UDP协议,为开发者提供了强大的工具来构建各种网络应用。理解并熟练掌握这些概念和技巧,是成为合格的IT专业人员的必要步骤。在实践中不断探索和学习,将有助于你更好地应对各种网络...

    通信协议——HTTP、TCP、UDP

    通信协议——HTTP、TCP、UDP TCP、HTTP、UDP 是三种不同的通信协议,它们之间存在着紧密的关系。TCP/IP 是一个协议组,可以分为四个层次:网络接口层、网络层、传输层和应用层。在传输层中有 TCP 协议与 UDP 协议。...

    Linux网络编程示例,TCP和UDP

    本压缩包文件聚焦于Linux环境下的网络编程,主要涉及TCP(传输控制协议)和UDP(用户数据报协议)这两种常见的网络通信协议。以下是基于提供的信息,对Linux网络编程中的TCP和UDP知识点的详细阐述: 1. **Linux ...

    网络编程2UDP编程 网络编程2UDP编程

    6. **错误处理**:由于UDP不提供内置的错误检测和重传机制,程序员需要自己实现这些功能。例如,你可以设定超时重发机制或者实现简单的校验和来检测数据完整性。 7. **性能优化**:虽然UDP速度快,但也要注意避免...

    网络编程之基于UDP的Socket编程

    基于UDP的Socket编程 ...基于 UDP 的 Socket 编程是一种高效、灵活的网络编程方式,适用于对时间要求较高的网络数据传输应用场景。但是,需要注意 UDP 协议的不可靠连接通信特性,及时处理数据的丢失或者破坏。

    TCP/IP和UDP的socket网络编程源码和文档

    本资源包提供的是基于TCP/IP和UDP的socket网络编程源码及文档,适用于实验平台mini2440开发板和Ubuntu操作系统。 TCP/IP协议栈是一个分层的通信模型,包含四层:链路层、网络层、传输层和应用层。TCP(Transmission...

    通信协议——Http、TCP、UDP

    ### 通信协议——Http、TCP、UDP #### 一、通信协议概述 通信协议是指在计算机网络中,为实现不同设备间的有效数据交换而制定的一系列规则和标准。这些规则规定了数据传输的方式、格式以及如何处理数据。常见的...

    http.rar_HTTP_earjmc_httpbin.org_nails6uv_网络编程——UDP

    在"网络编程——UDP"这个标签中,可能包含的是如何使用socket编程实现UDP通信,比如发送和接收数据报的过程。 在压缩包内的"nails6uv"文件,可能是本次练习的一个代码示例或者相关的项目名称。它可能包含了使用...

    黑马_Linux网络编程-网络基础-socket编程-高并发服务器

    本篇文章旨在深入解读“黑马_Linux网络编程-网络基础-socket编程-高并发服务器”相关的核心概念和技术要点,包括网络基础知识、常用网络协议、网络应用程序设计模式以及分层模型等内容。 #### 网络基础 网络基础...

    socket编程源码——UDP协议

    9. **缓冲区管理**:由于UDP没有内置的数据流控制,需要程序员自己管理发送和接收缓冲区的大小,防止数据溢出或丢失。 10. **性能考虑**:UDP比TCP更快,因为它没有握手和确认过程,但这也意味着没有流量控制和拥塞...

    Qt网络编程之搭建Udp通信【单播、组播、广播】

    本教程将聚焦于Qt网络编程中的UDP(User Datagram Protocol)通信,涵盖单播、组播和广播三种模式。通过提供的压缩包文件“组播.rar”、“广播.rar”和“单播.rar”,你可以找到对应模式的详细代码实例,并伴有丰富...

    编程实现基于UDP的PING (Java)

    在计算机网络中,PING是一种广泛...通过这个课程设计,你将深入理解UDP的工作原理,掌握Java中的网络编程技术,并能应用到实际的网络诊断和测试中。这个项目不仅锻炼了编程能力,还加深了对计算机网络基础知识的理解。

    TCP/UDP 网络编程

    总的来说,TCP和UDP网络编程是构建网络应用的基础,理解其工作原理和编程接口对于开发高效、可靠的网络服务至关重要。无论是TCP的可靠性还是UDP的效率,都需要根据具体应用场景来选择合适的协议。通过实践案例,我们...

Global site tag (gtag.js) - Google Analytics