2019.8.9 NIIT第二十八天 /种一棵树最好的时间是十年前,其次就是现在/ 明天要高考?什么烧烤? 最近有没有啥难题?什么凉皮? 你是不是有什么话讲?什么花甲?
UDP协议
- UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。
- 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
- 但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
UDP协议实现
发送和接收均可以使用的Socket类: DatagramSocket 数据打包的相关类: DatagramPacket 使用UDP发送或接收数据的步骤: 1、建立发送端,接收端; 2、创建数据; 3、建立数据包; 4、调用Socket的发送、接收方法; 5、关闭Socket。
使用UDP发送数据的步骤:
- 建立发送端,空参构造;
- 创建数据;
- 建立数据包;
- public DatagramPacket(byte[] buf, 数据打包成的字节数组
- int length, 数据的长度
- InetAddress address, 目标程序IP地址
- int port) 目标程序端口
- 调用Socket的发送。
- public void send(DatagramPacket p) 发送数据报包
- 关闭Socket。
- ps:发送端与接收端是两个对立的运行程序。
UDP发送端
package Day27;
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 UDPSendData {
public static void main(String[] args) {
//建立发送端
try {
DatagramSocket client=new DatagramSocket();
//发送数据
String s="卢本伟牛逼(>_<)";
//参数详情:
//字节数组:数据
//字节数组的偏移量
//发送字节的个数
//IP地址
//端口号
//数据包建立
DatagramPacket packet=new DatagramPacket(s.getBytes(),0,s.getBytes().length,InetAddress.getLocalHost(),12345);
//调用发送方法
client.send(packet);
//关闭
client.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
UDP接收端
package Day27;
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 UDPReciveData {
public static void main(String[] args) {
try {
DatagramSocket server=new DatagramSocket(12345,InetAddress.getLocalHost());
//获取数据包
// 1.新建接受的数据包
byte[] buf=new byte[1024];//一次最多接受1kb
DatagramPacket packet=new DatagramPacket(buf,0,buf.length);
//接受数据
server.receive(packet);
//解析数据包
InetAddress address= packet.getAddress();
System.out.println(address);
int port=packet.getPort();
System.out.println(port);
int length=packet.getLength();
System.out.println("数据长度:"+length);
byte[] b=packet.getData();
String s=new String(b);
System.out.println("数据:"+s);
//关闭
server.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行时,需要先开启接收端,再运行发送端,才能有数据显示
UDP是发送数据包,TCP是利用IO流来操作数据
通过TCP建立服务器端与客户端互相发送信息 客户端发给服务器
服务器
public class Server2 {
public static void main(String[] args) {
try {
//新建服务器端
ServerSocket server=new ServerSocket(8888);
System.out.println("等待客户端连接");
//2、开启服务器端,等待客户端来连接
while(true) {
Socket s=server.accept();
System.out.println("客户端连接成功");
System.out.println("客户端IP:"+s.getInetAddress()+"客户端端口号:"+s.getPort());
InputStream is=s.getInputStream();
byte[] b=new byte[1024];
int len=-1;
while((len=is.read(b))!=-1) {
String sre=new String(b,0,len);
System.out.println(sre);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户机
public class Client2 {
public static void main(String[] args) {
//新建一个客户端
try {
Socket s=new Socket("192.168.2.115",8888);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端发送给客户端
public class Server3 {
public static void main(String[] args) {
try {
//新建服务器端
ServerSocket server=new ServerSocket(8888);
System.out.println("等待客户端连接");
//2、开启服务器端,等待客户端来连接
Socket s=server.accept();
System.out.println("客户端连接成功");
System.out.println("客户端IP:"+s.getInetAddress()+"客户端端口号:"+s.getPort());
OutputStream os=s.getOutputStream();
//以行为单位输出,PrintWriter,关联到到Socket的输出流
PrintWriter out=new PrintWriter(os);
//输出
out.println("床前明月光");
out.println("疑是地上霜");
out.println("举头望明月");
out.println("低头思故乡");
out.flush();
s.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Client3 {
public static void main(String[] args) {
//新建一个客户端
try {
Socket client3=new Socket("192.168.2.115",8888);
//is是字节流
InputStream is=client3.getInputStream();
//isr是字符流
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
client3.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
实现一次C/S交互
package Day27_5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client4 {
public static void main(String[] args) {
//新建一个客户端
try {
Socket client3=new Socket("192.168.2.115",8888);
//is是字节流
InputStream is=client3.getInputStream();
//isr是字符流
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String line="";
while((line=br.readLine())!=null) {
System.out.println(line);
}
client3.shutdownInput();
Scanner sr=new Scanner(System.in);
System.out.print("用户:");
String str=sr.next();
OutputStream os=client3.getOutputStream();
PrintWriter out=new PrintWriter(os);
out.write(str);
out.flush();
client3.shutdownOutput();
client3.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package Day27_5;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server4 {
public static void main(String[] args) {
try {
//新建服务器端
ServerSocket server=new ServerSocket(8888);
System.out.println("等待客户端连接");
//2、开启服务器端,等待客户端来连接
Socket s=server.accept();
System.out.println("客户端连接成功");
System.out.println("客户端IP:"+s.getInetAddress()+"客户端端口号:"+s.getPort());
System.out.println("上来了一个客户");
//发送一条消息
Scanner sr=new Scanner(System.in);
System.out.print("客服:");
String str=sr.next();
OutputStream os=s.getOutputStream();
PrintWriter out=new PrintWriter(os);
out.write(str);
out.flush();
s.shutdownOutput();
InputStream is=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
System.out.println(br.readLine());
s.shutdownInput();
s.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}