数据报通信方式
UDP:是传输层的无连接通信协议
数据报是一种在网络中独立传播的自身包含地址信息的消息,它能否到达目的地.到达的时间以到达时的内容能否保持不变,这些都是不能保证,数据报是一种很基本的通信方式
Java.net提供了两个类:DatagramSocket和DatagramPacket支持数据报方式通信
简单介绍:DatagramSocket的对象是数据报通信的Socket,DatagramPacket的对象是一个数据报
在数据报方式实现Client/Server通信程序时,无论在Client端还是Server端,都要首先建立一个DatagramSocket对象
用来表示数据报通信的端点,应用程序通过该Socket接受或发送数据报,然后使用DatagramPacket对象封装数据报
(1).DatagramSocket
DatagramSocket()//与本机任何可用端口绑定
DatagramSocket(int port)//与指定的端口绑定
DatagramSocket(int port,InetAddress iaddr)//与指定的本地地址的指定的端口绑定
InetAddress iaddr用来表示一个IP地址
(2).DatagramPacket
DatagramPacket对象中封装了数据报(数据)数据长度,数据报地址等信息。
DatagramPacket类的构造方法可以构造两种用途的数据报:接受外来数据的数据报和要向外发送的数据报
(1).用于接收的数据报的构造
DatagramPacket(byte[] buf , int length)
构造用于接收长度为length的数据报,数据报保存在数组buf中。注意length必须小于或等于buf.length
DatagramPacket(byte[] buf,int offest, int length)
构造用于接收长度为length的数据报,并指定数据报在存储区buf中的偏移量
(2).用于发送的数据报构造
DatagramPacket(byte[] buf,int length,InetAddress address,int port)
构造用于发送指定长度的数据报,数据报将发送到指定的主机的指定端口。其中,buf是数据报中的数据,length是数据报的长度
address是目的地址,port是目的端口
数据报方式的通信过程(三步骤)
(1).创建数据报Socket
(2) .构造用于接收或发送的数据报,并调用所创建的Socket的receive()方法进行数据报接收或调用send()发送数据报
(3).通信结束,关闭Socket
数据报通信实例
Server端`
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class MyUdpServer {
DatagramSocket socket=null;
BufferedReader in=null;
boolean moreQuotes=true;
public void serverWork() throws IOException {
socket=new DatagramSocket(4445);
in=new BufferedReader(new FileReader("C:\Users\YANG\eclipse-workspace\test\src\test\sentences.txt"));
while(moreQuotes) {
//构建接收数据报并启动
byte[] buf=new byte[256];
DatagramPacket packet=new DatagramPacket(buf,buf.length);
socket.receive(packet);
//接收到Client端的数据报,并从sentences.txt中读取一行
//作为响应数据报并发送
String dString=null;
if((dString=in.readLine())==null) {
in.close();
moreQuotes=false;
dString="No more sentences.Bye!";
}
buf=dString.getBytes();
//从接收到的数据报中获取Client端的地址和端口
//构造相应数据报并发送
InetAddress address=packet.getAddress();
int port=packet.getPort();
packet=new DatagramPacket(buf,buf.length,address,port);
socket.send(packet);
}
socket.close();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyUdpServer server=new MyUdpServer();
try {
server.serverWork();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Client端:
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 MultiUdpClient {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket socket=new DatagramSocket();//创建数据报
byte[] buf=new byte[256];//构建请求数据报并发送
InetAddress address=InetAddress.getByName("localhost");
DatagramPacket packet=new DatagramPacket(buf,buf.length,address,4445);
socket.send(packet);
//构建请求数据报并启动接收
packet=new DatagramPacket(buf,buf.length);
socket.receive(packet);
String Received=new String(packet.getData());
System.out.println("服务器发来的信息:
"+Received);
socket.close();
}
}
其中sentences.txt就放在你的项目下
地址为右键sentences.txt——>porperities,找到该文件在你电脑上的地址就可以了
我也是跟着Java语言程序重新学习了Socket通信机制
之前的学习停留在表面浅显的认知,这次学习到Socket的机制感觉很好
在书上找到“三次握手,四次挥手“的答案
感觉越学问题越多,越想在细节上突破
知其然,更要知其所以然
比如线程这一章节,老师上课讲的例题都有点浅,到实战的时候就感觉不知所措
所以下一步深入学习线程,还会有一篇网络通信基础!