您的位置:首页 > 理论基础 > 计算机网络

(52)Java学习笔记——网络编程 / UDP协议

2017-02-20 09:37 597 查看
网络模型

OSI参考模型

TCP/IP参考模型

网络编程三要素

A / IP地址

网络中计算机的唯一标识。

IP地址的组成:网络号段 + 主机号段

IP地址的分类:A,B,C,D,E五类

A类:第一号段为网络号段+后三段的主机号段

B类:第二位号段为网络号段+后二段的主机号段

C类:前三位号段为网络号段+后一段的主机号段

B / 端口

C / 协议

IP地址

网络中计算机的唯一标识。

InetAddress类   (IP地址对象类)

构造方法无

成员方法:

public static InetAddress getByName(String host)    //根据主机名或者IP地址的字符串表示得到IP地址对象

public
StringgetHostName()
  //获取此 IP 地址的主机名。

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

范例:

package cn.itcast_01;

import java.net.InetAddress;
import java.net.UnknownHostException;
/*
* public static InetAddress getByName(String host)    //根据主机名或者IP地址的字符串表示得到IP地址对象
public String getHostName()   //获取此 IP 地址的主机名。
public String getHostAddress()    //返回 IP 地址字符串(以文本表现形式)。
*/
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
//public static InetAddress getByName(String host)
InetAddress address = InetAddress.getByName("192.168.0.8");

//获取两个东西,主机名,IP地址
//public String getHostName()   //获取此 IP 地址的主机名。
//public String getHostAddress()    //返回 IP 地址字符串(以文本表现形式)
String name = address.getHostName();
String ip = address.getHostAddress();
System.out.println(name+"---"+ip);

}
}

如果一个类没有构造方法:

A / 成员全部是静态的(Math  , Arrays ,  Collenctions)

B / 单例设计模式(Runtime)

C / 类中有静态方法返回该类的对象(InetAddress)

端口号

正在运行的程序的标识。

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

0~65535为有效端口。0~1024系统使用或保留端口。

网络协议

通信规则

UDP

把数据打包,数据限制64k。不建立链接,所以速度快。不可靠。

TCP

建立传输通道。数据无限制。速度慢。可靠。

Socket  网络套接字

Socket 包含了: IP地址和端口

通信的两端都要有Socket

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

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



UDP协议的返送和接收

构造方法:

public class
DatagramSocket   //类表示用来发送和接收数据报包的套接字。

UDP协议发送数据:

public void
send(DatagramPacket p)
 

 //从此套接字发送数据报包。
DatagramPacket
包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 

数据包对象:

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


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


代码:

package cn.itcast_02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/*
* UDP协议发送数据
* A / 创建发送端的Socket对象
* B / 创建数据并把数据打包
* C / 调用Socket对象的发送方法发送数据包
* D / 释放资源
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端Socket对象服务
//public class DatagramSocket
DatagramSocket ds = new DatagramSocket();

//创建数据并打包
//public void send(DatagramPacket p)
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//创建数据
byte[] bys = "hello,udp.我来了".getBytes();
//长度
int length = bys.length;
//ip地址对象
InetAddress address = InetAddress.getByName("192.168.0.8");
//端口
int port = 10086;

DatagramPacket dp = new DatagramPacket(bys,length,address,port);

//调用Socket对象的发送方法发送数据
ds.send(dp);
//释放资源
ds.close();

}
}
UDP协议接收数据

构造方法:

DatagramSocket(int port) //用来指定接收端口


数据包方法:

DatagramPacket(byte[] buf, int length)  //创建接受容器包


接收包方法

public voidreceive(DatagramPacket p)

解析包,拿到数据

publicInetAddressgetAddress()
  //获取对方IP

public byte[]getData()
 //返回数据缓冲区

public int getLength() //返回将要发送或接收到的数据的长度。

代码:

package cn.itcast_02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
* UDP协议发送数据
* A / 创建发送端的Socket对象
* B / 创建数据并把数据打包
* C / 调用Socket对象的发送方法发送数据包
* D / 释放资源
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端Socket对象服务
//public class DatagramSocket
DatagramSocket ds = new DatagramSocket();

//创建数据并打包
//public void send(DatagramPacket p)
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//创建数据
byte[] bys = "hello,udp.我来了".getBytes();
//长度
int length = bys.length;
//ip地址对象
InetAddress address = InetAddress.getByName("192.168.0.8");
//端口
int port = 10086;

DatagramPacket dp = new DatagramPacket(bys,length,address,port);

//调用Socket对象的发送方法发送数据
ds.send(dp);
//释放资源
ds.close();

}
}
UDP案例:

范例01:从键盘录入数据进行发送,如果输入的是886,那么客户段就结束输入数据

发送端:

package cn.itcast_03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
* SendDemo
* 数据来自键盘录入
* 键盘录入数据要自己控制录入结束
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();

//封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine())!= null){
if ("886".equals(line)){
break;
}
//创建数据并打包
byte[] bys = line.getBytes();
DatagramPacket dp =new DatagramPacket(bys,bys.length,
InetAddress.getByName("192.168.0.8"),12345);

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

//释放资源
ds.close();
}
}
接收端:

package cn.itcast_03;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
* ReceiveDemo
*
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(12345);

while(true){	//表示接收多次
//创建一个包裹容器
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);

//接收数据
ds.receive(dp);

//解析数据
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(),0,dp.getLength());
System.out.println("from"+ip+"data is:"+s);
}
//释放资源
//接收端需要一直开着,等待接收数据
//ds.close();
}
}

范例02:多线程实现聊天室

发送端

package cn.itcast_04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendThread implements Runnable {
//带参构造
private DatagramSocket ds;

public SendThread(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
try{
//封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine())!= null){
if ("886".equals(line)){
break;
}
//创建数据并打包
byte[] bys = line.getBytes();
DatagramPacket dp =new DatagramPacket(bys,bys.length,
InetAddress.getByName("192.168.0.8"),12306);

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

//释放资源
ds.close();
}catch(IOException e){
e.printStackTrace();
}

}

}

接收端
package cn.itcast_04;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveThread implements Runnable {
//带参构造
private DatagramSocket ds;

public ReceiveThread(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
try{
while(true){ //表示接收多次
//创建一个包裹容器
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);

//接收数据
ds.receive(dp);

//解析数据
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(),0,dp.getLength());
System.out.println("from"+ip+"data is:"+s);
}

}catch(IOException e){
e.printStackTrace();
}

}
}
服务端:
package cn.itcast_04;

import java.io.IOException;
import java.net.DatagramSocket;

/*
* 多线程实现聊天室程序,可以实现在一个窗口发送和接收数据
*
*/
public class ChatRoom {
public static void main(String[] args) throws IOException {
DatagramSocket dsSend = new DatagramSocket();
DatagramSocket dsReceive = new DatagramSocket(12306);

SendThread st = new SendThread(dsSend);
ReceiveThread rt = new ReceiveThread(dsReceive);

Thread t1 = new Thread(st);
Thread t2 = new Thread(rt);

t1.start();
t2.start();

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