Socket,TCP,UDP

本文介绍了网络模型中的TCP和UDP协议,强调了UDP的无连接特性和TCP的可靠性。详细讲解了TCP的三次握手过程,解释了在客户端挂断时服务器如何处理,并阐述了TCP四次挥手的断开连接机制。还提供了基于UDP的网络传输服务端和客户端代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络模型:

TCP协议,UDP协议

UDP:面向无连接(不用创建连接),在不创建连接的前提下,有可能发生丢包
           采用字节进行传输
           每个数据包的大小限制在64K以内
           不安全(不靠谱连接) 
           UDP唯一的好处:块
TCP:面向连接,客户端与服务器建立连接时要经历三次握手,采用字节进行数据的传输
           TCP较为安全,但是效率比UDP慢
HTTP协议的底层就是采用TCP协议

基于UDP的网络传输

服务端代码如下:

/**
 * UDP协议的服务器.
 */
public class UDPService {
    public static void main(String[] args) {
        System.out.println("服务器正在启动");
        try {
            //创建一个连接,没有传入IP地址就是本机 127.0.0.1.
            DatagramSocket socket = new DatagramSocket(8080);
            //接收客户端传递过来的数据.
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
            //等待客户端发送过来的数据,如果客户端没有建立连接的情况下就会阻塞.
            socket.receive(packet);
            //获取来源的IP和端口.
            System.out.println("IP地址" + packet.getAddress() + "\t端口" + packet.getPort());
            //接收数据,转换String字符串.
            String str = new String(packet.getData(), 0, packet.getLength());
            System.out.println("客户端发送过来的数据" + str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端代码如下:

/**
 * UDP协议客户端.
 */
public class UDPClient {
    public static void main(String[] args) {
        System.out.println("UDP客户端正在启动");
        try {
            //创建Socket对象.
            DatagramSocket socket = new DatagramSocket();
            //创建数据包.
            String a = "aaaaaaaa";
            DatagramPacket packet = new DatagramPacket(a.getBytes(), a.getBytes().length, InetAddress.getByName("127.0.0.1"), 8080);
            //发送数据包.
            socket.send(packet);
            //关闭socket.
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 先启动服务端再启动客户端。

TCP三次握手

SYN报文是建立连接用的

TCP协议中,客户端与服务器建立连接后,客户端突然挂了
答:客户端挂了,服务器会频繁向客户端发送保活机制的报文,如果响应了代表上来了,
    达到次数(10)后代码已经挂掉不再发送,客户端挂了就会开始建立下一次连接了。

TCP四次挥手:

当客户端与服务器要断开情况下,两个都断(同时)
FIN报文是断开连接用的
ACK代表收到客户端断开的请求

TCP案例

客户端代码如下

public class TCPClient {
    public static void main(String[] args) {
        try {
            //创建一个连接.
            Socket socket = new Socket("127.0.0.1", 8080);
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("没穿裤子".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
服务端代码如下
public class TCPServer {
    public static void main(String[] args) {
        try {
            System.out.println("tcp启动成功");
            //创建连接.
            ServerSocket socket = new ServerSocket(8080);
            //获取客户端请求,如果客户端没有请求的情况下就会堵塞.
            Socket accept = socket.accept();
            //获取客户端传输数据.
            InputStream inputStream = accept.getInputStream();
            //读取数据.
            byte[] bytes = new byte[1024];
            //如果有值返回一个值,如果没有值返回-1.
            int read = inputStream.read(bytes);
            System.out.println(new String(bytes, 0, read));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值