黑马程序员--网络传输

来源:互联网 发布:51单片机入门 编辑:程序博客网 时间:2024/06/14 22:36

一、网络简介

根据OSI把网络分为七个层次,分别是应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。其中网络层由IP协议进行传输,传输层由UDP和TCP协议传输。

UDP协议:

1、将数据及源和目的封装成数据包中,不需要建立连接。(封包,无连接)
2、每个数据包的大小限制在64k内。(小数据)
3、因无连接,是不可靠协议。(不可靠,丢数据)
4、不需要建立连接,速度快。(速度快)

TCP协议:

1、通过三次握手完成连接,是可靠协议。

2、面向连接的协议,速度慢,效率地。安全可靠。

二、UDP协议

UDP协议发送端:

1、建立UDP的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。

2、将数据封装成了数据包。

3、使用Socket服务的send方法将数据包发送。

public class Udp {

    public static void main(String[] args)throws Exception {

       // 1、指定端口,建立Socket

       DatagramSocket ds = new DatagramSocket(8900);//指定发送端口,不指定系统会自动分配。

       // 2、定义要发送的数据。

       String text = "UDP传输数据";

       byte[] buf = text.getBytes();

       // 3、将数据封装成了数据包。

       DatagramPacket dp = new DatagramPacket(buf, buf.length,

              InetAddress.getByName("202.199.73.80"), 8900);

       // 4、用socket服务的send方法将数据包发送出去。

       ds.send(dp);

       // 5、关闭连接。

       ds.close();

    }

}

UDP协议接收端:

1、创建UDP的socket服务,指定要接收的端口,只有发送到这个端口的信息才能被接收。

2、定义用于存储接收到数据的数据包。

3、通过Socket服务的接收方法将收到的数据存储到数据包中。

4、通过数据包的方法获取数据包中的具体数据内容。

5、关闭资源。

public class UdpServer {

    public static void main(String[] args)throws Exception {

       // 1 创建Socket服务。

       DatagramSocket ds = new DatagramSocket(8900);

       // 2 定义字节数组,将接受到的数据存放到字节数组中。

       byte[] buf =new byte[1024];

       DatagramPacket dp = new DatagramPacket(buf, buf.length);

       // 3 接受数据存放到数据包中

       ds.receive(dp);// 该方法是阻塞式方法。

       // 4 通过数据包获取端口,ip地址,传输的数据等信息。

       String ip = dp.getAddress().getHostAddress();

       int port = dp.getPort();

       // 将字节数组中的有效部分转成字符串。

       String text = new String(dp.getData(), 0, dp.getLength());

       System.out.println(ip +":" + port + "--" + text);

       // 5 关闭资源。

       ds.close();

    }

}

 

三、TCP协议

两个端点的建立连接后会有一个传输数据的通道,在网络基础上的流,称之为socket流。该流中既有读取,也有写入。

1、创建客户端Socket和服务器端ServerSocket。

2、建立客户端和服务器端连接。

3、建立连接后,通过Socket中的IO流进行数据的传输。

4、关闭Socket。

 

TCP客户端:

public class TcpClient {

    public static void main(String[] args)throws Exception {

       // 创建客户端的Socket服务,指定目的主机ip和端口

       Socket s = new Socket("202.199.73.80", 8900);

       // 获取socket流中的输出流。

       OutputStream out = s.getOutputStream();

       //将数据转换为字节

       out.write("TCP需要传输的数据".getBytes());

       //关闭连接

       s.close();

    }

}

TCP服务器端:

public class TcpServer {

 

    public static void main(String[] args)throws Exception {

       // 建立服务端socket服务,  并且指定监听的端口

       ServerSocket serverSocket = new ServerSocket(8900);

       // 通过accept方法获取连接过来的客户端对象。

       while (true) {

           Socket s = serverSocket.accept();

           //获取主机的IP地址

           String ip = s.getInetAddress().getHostAddress();

           System.out.println(ip +"连接成功");

           //获取客户端发来的输入流

           InputStream in = s.getInputStream();

           byte[] buf =new byte[1024];

           int len = in.read(buf);

           //将读取的数据转换为字符串

           System.out.println(new String(buf, 0, len));

           s.close();// 关闭客户端.服务

       }

    }

}


 

 

0 0
原创粉丝点击