您的位置:首页 > 理论基础 > 计算机网络

黑马程序员_UDP和TCP简单的通信代码和注释学习笔记

2014-03-14 13:28 701 查看
------- android培训java培训、期待与您交流! ----------

前言

UDP和TCP是比较常见的网络层通信协议。

从我自己概念上的理解:

从网络协议解析的角度来看,底层的IP协议解析完,获取IP地址,并确认后,就可以上抛给UDP或TCP来处理了。

从简单认知的角度来看,UDP和TCP做的相同的一件事,就是根据报文中指定的目的端口,转发各个报文到具体的应用程序。

首先,回顾一下Socket的概念:

Socket就是为了网络服务提供的一种机制。

通信的两端都有Socket。

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输。

下面就说明一下具体的代码实现:

UDP发送端的代码流程:

public static void main(String[] args) throws IOException{
//1、创建udp服务,通过DatagramSocket
DatagramSocket ds = new DatagramSocket();
//验证用数据
byte[] data = "udp".getBytes();
//2、根据数据,封装成数据包
DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 10000);
//3、通过socket服务,将已有的数据包发送出去,通过send方法。
ds.send(dp);
//4、关闭资源
ds.close();
}


UDP接收端的代码流程:

public static void main(String[] args) throws IOException {
//1、创建udp socket建立端点。要确定监听端口
DatagramSocket ds = new DatagramSocket(10000);
//2、定义数据包,用于存储
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//3、通过服务的receive方法将受到的数据存入数据包中
ds.receive(dp);
//4、通过数据包的方法获取其中的数据
System.out.println(new String(dp.getData(),0,dp.getLength()));
//5、关闭资源
ds.close();
}


感想:

从程序的角度而言:

1、对于UDP来说,是发送端与接收端的关系。

2、UDP是面向发送无连接的,也就是说,发送端只管发,不用确认是否能够达到接收端。

3、同时,很明显的,UDP是通过封装、解析数据包(Datapacket)的方式实现通信的。

4、接收端的receice()方法,是阻塞式方法。

5、Udp如果要建立双向的连接,需要通信两边都有发送端和接收端。

TCP客户端的代码:

public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端socket服务,指定目的的主机端口
Socket s = new Socket("127.0.0.1",10003);
//打开Socket输出流
OutputStream ops = s.getOutputStream();
//打开写入数据
ops.write("Hello tcp".getBytes());
//关闭输出流(如果服务端出现循环循环read的情况,必去用该方法)
s.shutdownOutput();
//获取输入流
InputStream ips = s.getInputStream();
byte[] buf = new byte[1024];
int len = ips.read(buf);
System.out.println(new String(buf,0,len));
//关闭流
s.close();
}


TCP服务端的代码:

public static void main(String[] args) throws IOException {
//创建服务端Socket,指定监听端口
ServerSocket ss = new ServerSocket(10003);
//获取客户端Socket流
Socket s = ss.accept();
//获取输入流
InputStream ips = s.getInputStream();
//获取输入流中的数据
byte[] buf = new byte[1024];
int len = ips.read(buf);
System.out.println(new String(buf,0,len));
//获取输出流
OutputStream ops = s.getOutputStream();
ops.write("ok!".getBytes());
//关闭客户端流对象
s.close();
//关闭服务端流对象
ss.close();
}


感想:

从程序的角度而言:

1、对于TCP来说,是服务端与客户端的关系。

2、TCP是面向连接的,也就是说,如果服务端、客户端没办法建立三次握手的连接通路,否则,根本没有数据传输可言。

3、同时,很明显的,TCP是通过流的方式实现通信的。

4、当然流中的read()方法和服务端的accpet()方法,是阻塞式方法。

5、TCP如果要建立双向的连接,只要保证连接通路,通过IO流就可以实现了。

------- android培训java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: