前言
学习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();
}
}