(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 地址字符串(以文本表现形式)。
范例:
如果一个类没有构造方法:
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)
//从此套接字发送数据报包。
数据包对象:
代码:
构造方法:
数据包方法:
接收包方法
public voidreceive(DatagramPacket p)
解析包,拿到数据
publicInetAddressgetAddress()
//获取对方IP
public byte[]getData()
//返回数据缓冲区
public int getLength() //返回将要发送或接收到的数据的长度。
代码:
范例01:从键盘录入数据进行发送,如果输入的是886,那么客户段就结束输入数据
发送端:
范例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();
}
}
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学习笔记52(网络编程:UDP协议案例)
- 网络编程(UDP/TCP)+JAVA学习笔记-DAY26
- Java学习笔记 UDP协议传输信息
- JAVA学习笔记Day24——javaTCP UDP网络编程Socket总结
- Android(java)学习笔记80:UDP协议发送数据
- Java 网络编程学习笔记 (五) UDP
- 黑马程序员________Java中UDP和TCP网络编程学习笔记
- java网络编程学习笔记之一(TCP/IP协议与UDP协议的区别和认识)
- java学习笔记(五)——网络编程
- java基础学习笔记——网络编程
- JAVA TCP网络编程学习笔记
- Learn Objective‐C,学习笔记04 协议(Java中的接口,c中的纯虚函数)
- Java学习—网络编程(UDP)
- 黑马程序员——Java学习笔记之⑦——“网络编程”
- Java学习笔记52:Java堆、栈和常量池
- 黑马程序员 【】java学习之路——网络编程 UDP 键盘录入传输
- java学习笔记12———网络编程
- UDP基本协议学习笔记
- WinSock网络编程学习笔记(九):基于UDP实现DayTime协议
- TCP/IP详解--学习笔记(6)-UDP协议