学习java—第二十八天学习笔记

155 阅读4分钟

2019.8.9 NIIT第二十八天 /种一棵树最好的时间是十年前,其次就是现在/ 明天要高考?什么烧烤? 最近有没有啥难题?什么凉皮? 你是不是有什么话讲?什么花甲?

UDP协议

  • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。
  • 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
  • 但是在使用UDP协议传送数据时,由于UDP的面向无连接性不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。

UDP协议实现

发送和接收均可以使用的Socket类: DatagramSocket 数据打包的相关类: DatagramPacket 使用UDP发送或接收数据的步骤: 1、建立发送端,接收端; 2、创建数据; 3、建立数据包; 4、调用Socket的发送、接收方法; 5、关闭Socket。

使用UDP发送数据的步骤:

  1. 建立发送端,空参构造;
  2. 创建数据;
  3. 建立数据包;
  • public DatagramPacket(byte[] buf, 数据打包成的字节数组
  • int length, 数据的长度
  • InetAddress address, 目标程序IP地址
  • int port) 目标程序端口
  1. 调用Socket的发送。
  • public void send(DatagramPacket p) 发送数据报包
  1. 关闭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();
		}
	}
}