网络编程UDP和TCP 二

爱⌒轻易说出口 提交于 2020-02-04 14:27:25

TCP

TCP :一种面向连接(连接导向)的,可靠的,基于字节流的运输层,通讯协议
特点: 面向连接,
点到点的通信
高可靠性
占用系统资源多,效率低
UDP: 一种无连接的传输层协议,提供面向事务的简单不可靠信息传世服务
特点: 非面向连接,传输不可靠,可能丢失
发送不管对方是否准备好,接收方收到也不确认
可以广播发送
非常简单的协议,开销小
套接字Socket
我们开发的网络应用程序位于应用层,TCP和UDP 属于传输层协议
在应用层如何使用传输层的服务呢?
在应用层和传输层之间,则是使用套接字来进行分离
套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据,而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心他如何传输,这属于网络其他层次的工作

UDP编程

UDP发送端

package UDP编程;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

/**
 * 发送端
 * 1.使用DatagramSocket 指定端口创建发送端
 * 2.准备数据容器,一定转换成字节数组,
 * 3.封装成DatagramPacket包裹,需要指定目的地
 * 4.发送包裹send(DatagramPacket p)
 * 5.释放资源
 * @author T011921
 *
 */
public class UdpClient {
	public static void main(String[] args) throws Exception {
		System.out.println("发送方启动中。。。");
//		 * 1.使用DatagramSocket 指定端口 创建发送端
		DatagramSocket client = new DatagramSocket(8888);
//		 * 2.准备数据容器,一定转换成字节数组,
		String data = "武汉加油,中国加油";
		byte[] datas = data.getBytes();
//		 * 3.封装成DatagramPacket包裹,需要指定目的地
		DatagramPacket packet = new DatagramPacket(datas,0,datas.length,
				new InetSocketAddress("localhost",9999));
//		 * 4.发送包裹send(DatagramPacket p)
		client.send(packet);
//		 * 5.释放资源
		client.close();
	}
}


UDP接收端

package UDP编程;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 接收端
 * 1.使用DatagramSocket 指定端口创建接收端
 * 2.准备容器,封装成DatagramPacket包裹
 * 3.阻塞式接收包裹receive(DatagramPacket p)
 * 4.分析数据
 * 	byte[] getData()
 *  	   getLength()
 * 
 * @author T011921
 *
 */
public class UdpServer {
	public static void main(String[] args) throws Exception {
		System.out.println("接收方接收中");
//		 * 1.使用DatagramSocket 指定端口创建接收端
		DatagramSocket server = new DatagramSocket(9999);
//		 * 2.准备容器,封装成DatagramPacket包裹
		byte[] container = new byte[1024*60];
		DatagramPacket packet = new DatagramPacket(container,0,container.length);
//		 * 3.阻塞式接收包裹receive(DatagramPacket p)
		server.receive(packet);
//		 * 4.分析数据
//		 * 	byte[] getData()
//		 *  	   getLength()
		byte[] datas = packet.getData();
		int len = packet.getLength();
		System.out.println(new String(datas,0,len));
//		5.释放资源
		server.close();
	}
}

TCP编程

TCP客户端

package TCP编程;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 	熟悉流程
 * 创建客户端服务器
 * 1.建立连接,使用Socket创建客户端+服务的地址和端口
 * 2.操作:输入输出流操作
 * 3.释放资源
 *
 */
public class Client {
	public static void main(String[] args) throws Exception, IOException {
		System.out.println("-------------clent------");
//		* 1.建立连接,使用Socket创建客户端+服务的地址和端口
		Socket client = new Socket("localhost",8888);
//		 * 2.操作:输入输出流操作
		DataOutputStream dos = new DataOutputStream(client.getOutputStream());
		String data = "hello";
		dos.writeUTF(data);
//		 * 3.释放资源
		dos.close();
		client.close();

	}
}

TCP服务端

package TCP编程;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 	熟悉流程
 * 创建服务器
 * 1.指定端口,使用ServerSocket创建服务器
 * 2.阻塞式等待连接 accept
 * 3.操作:输入输出流操作
 * 4.释放资源
 *
 */
public class Server {

	public static void main(String[] args) throws Exception {
		System.out.println("-------------server------");
//		* 1.指定端口,使用ServerSocket创建服务器
		ServerSocket server =new  ServerSocket(8888);
//		 * 2.阻塞式等待连接 accept
		Socket client =  server.accept();
		System.out.println("一个客户端建立了连接");
//		 * 3.操作:输入输出流操作
		DataInputStream dis = new DataInputStream(client.getInputStream());
		String data = dis.readUTF();
		System.out.println(data);
//		 * 4.释放资源
		dis.close();
		client.close();
		server.close();
	}
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!