您的位置:首页 > 职场人生

黑马程序员_java语言_UDP

2015-06-05 01:11 471 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

###20.01_网络编程(网络编程概述)
* A:计算机网络

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

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

* InetAddress:此类表示互联网协议 (IP) 地址。

  IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的

  方法:

   public static InetAddress getByName(String host)

               在给定主机名的情况下确定主机的 IP 地址。

               

            public String getHostName()

             获取此 IP 地址的主机名。 

             public String getHostAddress()

             返回 IP 地址字符串(以文本表现形式)。

<span style="font-size:14px;">public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
//获取IP地址对象
//InetAddress ipAddress = InetAddress.getByName("LKP-PC");
//InetAddress ipAddress = InetAddress.getByName("192.168.27.102");
InetAddress ipAddress = InetAddress.getByName("192.168.27.110");

//获取主机名称和IP地址
String name = ipAddress.getHostName();
String address = ipAddress.getHostAddress();
System.out.println("主机名:" + name +", ip地址: " + address);
}
}</span>

###20.02_网络编程(网络编程三要素之IP概述)
* 每个设备在网络中的唯一标识
* 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。 
* ipconfig:查看本机IP192.168.17.30
* ping:测试连接192.168.40.62
* 本地回路地址:127.0.0.1 255.255.255.255是广播地址
* IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。 
* IPv6:8组,每组4个16进制数。
* 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
* 1a2b::aaaa:0000:0000:0000:aabb:1f2f
* 1a2b:0000:aaaa::aabb:1f2f
* 1a2b:0000:aaaa::0000:aabb:1f2f
* 1a2b:0000:aaaa:0000::aabb:1f2f

###20.03_网络编程(网络编程三要素之端口号概述)
* 每个程序在设备上的唯一标识
* 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
* 端口号范围从0-65535
* 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
* 常用端口

    * mysql: 3306

    * oracle: 1521

    * web: 80

    * tomcat: 8080

    * QQ: 4000

    * feiQ: 2425

###20.04_网络编程(网络编程三要素协议)
* 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
* UDP

    * 面向无连接,数据不安全,速度快。不区分客户端与服务端。
* TCP

  * 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。

    * 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据

UDP协议发送端

 *

 * 步骤:

 *  1:创建发送端Socket对象

 *  2:准备发送的数据

 *  3:把数据进行封装,指定数据的目的地

 *  4:发送数据

 *  5:关闭Socket对象

 * DatagramSocket: UDP协议发送与接收数据所使用的Socket套接字

 *    构造方法:

 *     public DatagramSocket(): 空参数构造方法

 *    方法:

 *     public void send(DatagramPacket p)

             从此套接字发送数据报包

 *     public void close()

 *      关闭此数据报套接字。

 *

 * DatagramPacket: 此类表示数据报包

   构造方法:

    DatagramPacket(byte[] buf, int length, InetAddress address, int port)

<span style="font-size:14px;">public class UDPSent {
public static void main(String[] args) throws IOException {
//1:创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();

//2:准备发送的数据
byte[] buf = "abcde".getBytes();

//3:把数据进行封装,指定数据的目的地
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.27.102"), 12306);

//4:发送数据
ds.send(dp);

//5:关闭Socket对象
ds.close();

}
}
</span>

###20.05_网络编程(Socket通信原理)
* A:Socket套接字概述:

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

    * 通信的两端都有Socket。

    * 网络通信其实就是Socket间的通信。

    * 数据在两个Socket间通过IO流传输。

    * Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。

###20.06_网络编程(UDP传输)
* 1.发送Send

    * 创建DatagramSocket, 随机端口号

    * 创建DatagramPacket, 指定数据, 长度, 地址, 端口

    * 使用DatagramSocket发送DatagramPacket

    * 关闭DatagramSocket
* 2.接收Receive

    * 创建DatagramSocket, 指定端口号

    * 创建DatagramPacket, 指定数组, 长度

    * 使用DatagramSocket接收DatagramPacket

    * 关闭DatagramSocket

    * 从DatagramPacket中获取数据

<span style="font-size:14px;">public class UDPReceive {
public static void main(String[] args) throws IOException {
//1:创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(10086);

while (true) {
//2:创建空的数据包(空的仓库)
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);

//3:接收数据,存入到空的数据包(空的仓库)
ds.receive(dp);

//4:解析数据包(仓库)中的内容
//ip地址
String ip = dp.getAddress().getHostAddress();
//数据
String data = new String(dp.getData(), 0, dp.getLength());
//显示
System.out.println("IP:"+ip + ",数据:" + data);
}

//5:关闭Socket流
//ds.close();
}
}</span>

* 3.接收方获取ip和端口号

    * String ip = packet.getAddress().getHostAddress();

    * int port = packet.getPort();

  UDP协议的接收端

 步骤:

 *   1:创建接收的Socket对象

 *   2:创建一个空的数据报包(空的仓库)

 *   3:接收数据,并把数据存入到空的数据报包(空的仓库)

 *   4:解析数据报包(仓库)中的内容

 *   5:关闭Socket对象

<span style="font-size:14px;">public class UDPReceive {
public static void main(String[] args) throws IOException {
//1:创建接收的Socket对象
DatagramSocket ds = new DatagramSocket(12306);

//2:创建一个空的数据报包(空的仓库)
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);

//3:接收数据,并把数据存入到空的数据报包(空的仓库)
ds.receive(dp);

//4:解析数据报包(仓库)中的内容
//获取数据报包是谁发来的, 获取ip地址
InetAddress ipAddress = dp.getAddress();
String ip = ipAddress.getHostAddress();
//获取数据报包中的数据
byte[] data = dp.getData();
//获取数据的长度
int len = dp.getLength();
String str = new String(data, 0, len);

//显示数据
System.out.println("IP:" + ip + ",数据:" + str);

//5:关闭Socket对象
ds.close();

}
}
</span>


###20.07_网络编程(UDP传输优化)

需求:

 *    键盘输入数据

 *   无限发数据,当输入的内容为886时,结束程序

 *

 * 步骤:

 *   1:创建发送端的Socket对象

 *   2:准备要发送的数据

 *    键盘输入数据

 *   3:把数据进行封装(IP地址,端口号)

 *   4:发送数据

 *   5:关闭流 

<span style="font-size:14px;">public class UDPSent {
public static void main(String[] args) throws IOException {
//1:创建发送端的Socket对象
DatagramSocket ds = new DatagramSocket();

while (true) {
//2:准备要发送的数据
//Scanner
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
String line = br.readLine();

//判断,当输入的内容为886时,结束程序
if ("886".equals(line)) {
break;
}
byte[] buf = line.getBytes();

//3:把数据进行封装(IP地址,端口号)
//DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.27.102"), 10086);

//换成广播地址,同一个网络内的电脑都可以接收到我发送的数据
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.27.255"), 10086);

//4:发送数据
ds.send(dp);
}
//5:关闭流
ds.close();
}
}
</span>

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: