java中的UDP和TCP

一 网络基础

网络通信三要素:

  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也关闭了
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值