Java:网络编程套接字(socket)

时间:2024-11-06 08:20:01

TCP和UDP的区别:

TCP:有连接,可靠传输,面向字节流,全双工;

UDP:无连接,不可靠传输,面向数据报,全双工;

有连接/无连接:

此处的连接是"抽象"的连接:

通信双方如果保存了通信对端的信息,就相当于是"有连接";

如果不保存对端的信息,就是"无连接";

可靠传输/不可靠传输:

此处谈到的可靠,不是100%到达对方,而是"尽可能";

网络环境非常复杂,存在很多不确定因素.

TCP内置了一些机制能保证可靠传输:

(1)感知对方是不是收到了数据;

(2)重传机制,在对方没收到的时候进行重试;

UDP则没有可靠性机制,完全不管发出去的数据是否能顺利到达对方;

面向字节流/面向数据报:

TCP是面向字节流的,TCP的传输过程就和文件流/水流是一样的特点;

UDP传输数据的基本单位不是字节,而是"UDP数据报",一次发送/接受,必须发送/接受完整的数据报.

全双工/半双工:

全双工:一个通信链路,可以发送数据,也可以接受数据(双向通信);

半双工:一个通信链路,只能发送/只能接受(单向通信);        

TCP/UDP api的使用

UDP

DatagramSocket

代表一个socket对象(操作系统中的概念);

socket可以认为是操作系统中广义的文件下里面的一种文件类型;

这样的文件,就是网卡这种硬件设备,抽象的表示方式;

(使程序员不必去关注硬件的差异和细节,直接操作socket对象,就能间接操作网卡)

构造方法:

DatagramSocekt方法:

DatagramPacket

代表一个UDP数据报(UDP传入传出数据的基本单位).

构造方法:

DatagramPacket方法:

写一个最简单的客户端服务器程序,不涉及到业务流程,只是对api的用法做演示.

"回显服务器"(echo server):客户端发啥样的请求,服务器就返回怎么样的响应.

没有任何业务逻辑,没有任何计算和处理.

InetSocketAddress

构造UDP发送的数据报时,需要传⼊ SocketAddress ,该对象可以使⽤ InetSocketAddress

来创建.

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

public class UDPEchoServer {
    private DatagramSocket socket = null;

    public UDPEchoServer(int port) throws SocketException {
        //服务器必须指定端口号,这样客户端才能找到服务器
        socket = new DatagramSocket(port);
        //在调用这个构造方法的过程中,jvm就会调用系统的socket api完成"端口号-进程"之间的关联动作.
        //"绑定端口号"bind.
        //对应一个系统来说,同一时刻,一个端口号只能被一个进程绑定,但是一个进程可以绑定多个端口号.
        //端口号就是为了区分进程,收到数据之后,明确说这个数据要给谁.
        //如果有多个进程尝试绑定同一个端口号,后来的进程就会绑定失败.
        //对于服务器一端来说,需要在socket对象创建的时候,就指定一个端口号,作为构造方法的参数.
        //后续服务器开始运行之后,操作系统,就会把端口号和该进程关联起来.

    }

    //通过start启动