想学习一个类,不如先了解这个类中有什么方法!
DatagramSocket类 用法详解:
一:构造方法
1.DatagramSocket():
表示创建一个默认的套接字,并绑定到本地地址和一个随机的端口号
2.DatagramSocket(int port):
与上面不同的是,绑定到特定端口号,其它不变
3.DatagramSocket(int port, InetAddress iad):
表示创建一个套接字,绑定到特定的端口号及指定地址
4.DatagramSocket(SocketAddress sad);
表示创建一个套接字,绑定到特定的套接字地址
二:基本方法
1. close():
关闭套接字
2.recevie(DatagramPacket dp):
接受数据报
3.send(DatagramPacket dp):
三:发送数据报:
DatagramPacket类:
构造方法:(只列出主要的)
1.接受类型:
DatagramPacket(byte[] buf, int length):
用来接受长度为length的buf数据(即数据存于字节数组buf中)
2.发送类型:
DatagramPacket(byte[] buf, int length, InetAddress address, int port);
将length长的buf数据发送到指定的地址的端口号处
DatagramPacket(byte[] buf, int length, SocketAddress address);
四.读入数据:
BufferedReader可以用来读取文件或者接收来自键盘(控制台)的信息。它比Scanner更加快捷,能够大幅度缩短程序运行时间。它下面的readline()方法可以一次性读取一行文字(String),非常方便。需要注意的是,使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)。以及,在使用完BufferredReader以后,需要用close()方法关闭流。
InputStreamReader是字节流通向字符流的桥梁,封装了InputStream里面,她以高级的形式一次读取一个一个字符,以文本格式输入输出,可以指定编码格式;
每次调用IntputStreamReader中的read()方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节
为了达到最高效率,可要考虑在 BufferedReader内包装InputStreamReader:
例如:
1.接收控制台信息时:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
2.读取文件时:
BufferedReader br = New BufferedReader(data);
3.它的realine()方法:
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s= input.readLine();
input.read(o);
}
DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送数据报的套接字
三:UDP的简单应用(简单通信,可以反复说话)
代码实现发送端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;
public class Send {
public static void main(String[] args) throws Exception {
//首先建立socket对象
DatagramSocket dsocket = new DatagramSocket();
//写信
while(true) {//循环说话
//发送数据
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
String str = read.readLine();
//发送要通过一个数据包,这个数据包相当有一个信封,信封组成:发送的数据,长度,收件人的地址,收件人的邮编
DatagramPacket sendpacketage = new DatagramPacket(str.getBytes(),//需要转换成byte,发送的数据
str.length(),//获取长度
InetAddress.getByName("127.0.0.1"),//自己的地址,发件人要填自己的地址
8000); //想象成邮编
//发送
dsocket.send(sendpacketage);
byte []buf = new byte[1024];
DatagramPacket recivicepacket = new DatagramPacket(buf, buf.length);
dsocket.receive(recivicepacket);
System.out.println(new String(buf,0,recivicepacket.getLength()));
}
}
}
代码实现接收端: