Java中的TCP和UDP连接

运输层的两个主要协议

  • UDP
      - UDP 是无连接的,即发送数据之前不需要建立连接,(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据的时延。
      - UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表
      - UDP 是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付 IP 层
      - UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低
      - UDP 的首部开销小,只有8个字节,比 TCP 的20个字节的首部要短。
  • TCP
      - TCP 是面向连接的运输层协议,就是说,应用程序在使用 TCP 协议前,必须建立 TCP 连接。在传输结束后,必须释放已经建立的 TCP 连接,类似于打电话,:通话之前先拨号建立连接,通话之后要挂机释放连接。
      - 每一条 TCP 连接只能由两个端点,每一条 TCP连接只能是点对点的。
      - TCP提供可靠交付的服务。通过TCP 连接传送的数据,无差错,不丢失,不重复,并且按序到达。
      - TCP提供全双工通信,TCP允许通信双方的应用进程在任何时候都能够发送数据,TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
      - 面向字节流。TCP中的流指的是流入到进程或者是从进程流出的字节序列,面向字节流的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
    1.基于TCP协议的Scoket编程

服务端

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        //开启一个监听端口
        ServerSocket socket = new ServerSocket(8080);
        while (true){
            //等待连接
            Socket accept = socket.accept();
            System.out.println("服务器连接成功");
            //获得客户端传入的数据流
            DataInputStream dataInputStream = new DataInputStream(accept.getInputStream());
            String s = dataInputStream.readUTF();
            //读取数据
            System.out.println(s);
            if (s.equals("exit")){
                break;
            }
        }
        socket.close();
    }
}

客户端

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = null;
        while (true){
            //创建一个连接将其连接到指定的IP地址的指定端口号
            socket = new Socket("127.0.0.1", 8080);
            System.out.println("客户端连接成功");
            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            dataOutputStream.writeUTF(s);
            if (s.equals("exit")){
                break;
            }
        }
        socket.close();
    }
}

1.基于UDP协议的Scoket编程

发送方

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class peopleTwo {
    public static void main(String[] args) throws IOException {
        //发送方
        //指定一个端口
        DatagramSocket socket = new DatagramSocket();
        //指定一个IP
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 8080;
        //准备一个容器
        byte[] sendBuf;
        while (true){
            System.out.println("你要发送什么东西");
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            //加入要发送的数据
            sendBuf = s.getBytes();
            //数据打包
            DatagramPacket packet = new DatagramPacket(sendBuf,  sendBuf.length,address,port);
            socket.send(packet);
            if(s.equals("exit")){
                break;
            }
        }
        socket.close();
    }
}

接收方

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class peopleOne {
    //UDP是无连接的
    public static void main(String[] args) throws IOException {
        //接收方
        //1开放一个端口
        DatagramSocket socket = new DatagramSocket(8080);
        //2.准备一个容器接受
        byte[] receBuf = new byte[100];
        //等待包裹容器收包
        DatagramPacket packet = new DatagramPacket(receBuf, receBuf.length);
        while (true){
            //接受包裹
            socket.receive(packet);
            //解析包裹
            String s = new String(packet.getData(), 0, packet.getLength());
            //输出文件
            System.out.println(s);
            if(s.equals("exit")){
                break;
            }
        }
        //释放资源
        socket.close();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值