java中的UDP和TCP

来源:互联网 发布:php人力资源管理系统 编辑:程序博客网 时间:2024/05/24 23:14

一 网络基础

网络通信三要素:

  1. IP
  2. 端口号
  3. 协议

IP地址的本质:是一个由32位的二进制数据组成的数据,为了方便记忆IP地址就把IP地址切成了4份,每份8bit。

1.1 InetAddress(IP类)

常用方法:

getLocalHost();//获取本机的IP地址对象getHostAddress(); //返回一个IP地址的字符串表示形式getHostName();//获取主机名getByName("IP或者主机名");//根据IP地址的字符串形式或者主机名生成一个IP地址对象----很常用

1.2 端口 —- 端口就是一个(0-65535)标识符

1.3 通讯协议

通讯协议分为两种:

UDP通讯协议
TCP通讯协议

二 UDP

特点:

  1. 将数据封装为数据包,面向无连接。
  2. 每个数据包大小限制在64K中
  3. 因为无链接,所以不可靠,速度快。

使用示例:

 //发送端代码 public class Sender{  public static void main(String[] args)   {     //建立udp服务     DatagramSocket datagramSocket = new DatagramSocket();     String data = @"upd的数据";     //把数据封装到数据包中 DatagramPacket(buf, length, address) buf:发送的数据内容  length:发送数据内容的大小  address:发送目的IP地址对象  port:端口号     DatagramPacket packet = new       DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getLocalHost(),9091);   //发送数据包   datagramSocket.send(packet);     //关闭资源   datagramSocket.close();   }}----------//接收端代码public class Receive {  public static void main(String[] args)  {    //建立udp服务,并且监听一个端口    DatagramSocket socket = new DatagramSocket(9091);    //准备空的数据包用于存放数据    byte[] buf = new byte[1024];    DatagramPacket packet = new DatagramPacket(buf,buf.length);    //接收数据  数据实际上存储在buf数组中  receive是一个阻塞型方法,没有接收到数据就一直阻塞    socket.receive(packet);    //取出数据    String data = new String(buf,0,packet.getLength());//getLength() 获取数据包存储了几个字节    //关闭资源    socket.close();  }}

注意:

每个网络程序都有自己所处理的特定格式的数据,如果接收到的数据不符合指定的格式,那么就会被当成垃圾数据丢弃。
udp协议中,有一个IP地址称作为广播地址(就是主机号为255的地址–xxx.xxx.xx.255),给广播IP地址发送消息的时候,在同一个网络段的机器都可以接收到信息。

三 TCP

特点:

  1. tcp是基于IO流进行数据传输的,面向连接。
  2. tcp进行数据传输的时候是没有大小限制的。
  3. tcp通过三次握手的机制。
  4. tcp是面向连接的,所以速度慢。
  5. tcp是区分客户端与服务端的

使用示例:

//客户端代码public class Client{   public static void main(String[] args)   {      //建立连接      Socket socket = new Socket(InetAddress.getLocalHost(),9090);      //获取输出流      OutputStream os = socket.getOutPutStream();      //向服务端发送数据      os.write("这是客户端的数据".getBytes());      //关闭资源      socket.close();//因为os是从socket中获取的,所以socket关闭的时候os也关闭了   }}----------//服务端代码public class Server{  public static void main(String[] args)  {    //建立tcp的服务端,并且监听一个端口    ServerSocket serverSocket = new ServerSocket(9090);    //接受客户端的连接    Socket socket = serverSocket.accept();//accept() 这是一个阻塞型的方法,没有客户端与其连接时,会一直等待下去     //获取输入流对象,读取客户端发送的内容    InputStream is = socket.getInputStream();     byte[] buf = new byte[1024];    int length = is.read(buf);    System.out.println("接收到的数据:"+new String(buf,0,length));    serverSocket.close();//因为socket是从serverSocket中获取的,所以serverSocket关闭的时候socket也关闭了  }}
原创粉丝点击