TCP与UDP的简单理解

前言

学习Java总是会涉及到网络编程,而TCP与UDP是网络编程的基础吧,下面来讲一讲自己的最近所学,以及分享一下几个简单的例子。

InetAdresss

InetAdress方法是一个静态方法,使用无需实例化,该方法里面有很多获取ip地址或者获取主机名称的方法,下面先讲几个常用到的方法,
getByName():这个方法的参数可以是ip地址,也可以是主机名称
getHostAddress():这个方法也是顾名思义就是获取本地电脑的ip地址
getHostName():这个方法是获取本机电脑的主机名字

public class InetAdressDemo {
 public static void main(String[] args) throws UnknownHostException {
	//static InetAdress getByName(String name)
	 InetAddress address=InetAddress.getByName("172.25.6.3");
	 System.out.println(address);//返回值为/172.25.6.3
	 String hostAdress=address.getHostAddress();
	 System.out.println(hostAdress);//返回值为172.25.6.3
	 String hostName=address.getHostName();
	 System.out.println(hostName);//返回值为主机名
}
}

UDP实例

udp是一个不太靠谱的传播,发送端发送数据的时候就算没有接收端也不会报错,因为它就是发出去就好了,对方有没有收到跟它没有关系,但是他的性能好,传播快。
DUP发送主要有四个步骤,分别为:
1.创建socket对象创建socket对象使用的是DatagramSocket对象
2.打包数据打包数据用的是DatagramPacket对象,DatagramPacket有很多不同的构造函数,参数有所不同,可以根据自己的实际情况进行调整
3.发送数据就是直接使用send方法
4.关闭socket对象

public class sendDemo {
public static void main(String[] args) throws IOException {
	//第一步:创建socket对象
	DatagramSocket ds=new DatagramSocket();
	//第二部:打包数据
	String s="hello udp,im comming!";
	byte[] bye=s.getBytes();
	int port=8888;
	int length=bye.length;
	InetAddress address=InetAddress.getByName("JOIK5SDUJ7URGW8");
	DatagramPacket dp=new DatagramPacket(bye, length, address,port);
	//发送数据
	ds.send(dp);
	//关闭socket对象
	ds.close();
}
}

因为UDP是一个不靠谱的协议,所以洗完以上的客户端,就算不写服务器端直接运行也不会出错,因为数据就算没有人收到它也不会反馈,但是这里还是写一下服务器端,还是在本机写,度武器端主要包括四个步骤:
1.创建socket对象
2.接受数据
3.数据整理
4.关闭socket对象

public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		DatagramSocket ds=new DatagramSocket(8888);
		byte[] bye=new byte[1024];
		DatagramPacket dp=new DatagramPacket(bye, bye.length);
		ds.receive(dp);
		InetAddress address= dp.getAddress();
		byte[] data=dp.getData();
		int length=dp.getLength();
		System.out.println("sender---->"+address.getHostAddress());
		System.out.println(new String(data));
		ds.close();
	}
}

先运行客户端,再运行服务器端,也可以倒过来,然后在控制台就可以看到同事运行了两个程序:
在这里插入图片描述
点击箭头所指的地方就能看到服务器端和客户算,分别查看有没有输出的结果。

TCP

相比UDP,TCP是一个比较靠谱的协议,如果发出去的数据没有被收到,会反馈回来,但是它额性能页会比UDP的低一些。讲到TCP就会自然想到它额三次握手,四次挥手。先来讲一讲TCP的三次握手:
第一次握手:客户端发送给服务端(SYN=1,seq=x)告诉客户端要连接了,x是随机生成的数。
第二次握手:服务器端发送给客户端(SYN=1,seq=y,ACK=X+1),回应客户端的请求,y是速记生成的数,
第三次握手:客户端再次发送信息给服务器端(SYN=1,ACK=Y+1,seq=x+1)
三次握手之后,就建立了连接,可以传输数据了。
TCP的四次挥手:
第一次挥手:客户端向服务器端发送信息(FIN=1,seq=x),x也是堆积生成的数
第二次挥手:服务器端向客户端发送数据(FIN=1,ACK=x+1,seq=y),y是随机生成的数
第三次挥手这是为了确保断开前,所有传输给客户端的数据都传输完毕,这个时候会发送信息给客户端(FIN=1,ACK=x+1,seq=z),z也是随机数
第四次挥手:客户端向服务器端发送数据(FIN=1,ACK=z+1,seq=h),h是随机数
四次挥手之后,两端就断开了连接。

TCP实例

tcp的传输流程与udp大同小异:
1.创建socket对象,使用ServerSocket创建
2.监听,返回一个socket对象,使用accept进行监听
3.获取数据,接受数据是通过普通的inputStream流
4.关闭sockt对象
服务器端代码:

public class ServerDemo {
public static void main(String[] args) throws IOException {
	//创建socket对象
	ServerSocket ss=new ServerSocket(10086);
	//监听,返回一个socket对象
	Socket s=ss.accept();
	//获取数据
	InputStream is=s.getInputStream();
	byte[] bye=new byte[1024];
	int length;
	//将读入的数据放在bye数组中
	length=is.read(bye);
	System.out.println(new String(bye,0,length));
	s.close();
	ss.close();
}
}

客户端创建步骤:
1.创建socket对象,使用Socket创建
2.获取socket的输出流,使用outputStream
3.发送数据,将数据打包成字节数组
4关闭socket对象.
具体代码:

public static void main(String[] args) throws UnknownHostException, IOException {
		//创建socket对象,指定目标ip和端口
		Socket s=new Socket(InetAddress.getByName("JOIK5SDUJ7URGW8"),10086);
        //获取socket的输出流
		OutputStream os=s.getOutputStream();
		String str="hello tcp,im coming,我是阿丽!";
		os.write(str.getBytes());
		os.close();
		s.close();
        
        
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值