网络编程:Socket和 Server Socket

一、ServerSocket
       1.介绍:
ServerSocket类提供了创建服务器套接字的功能,它能够监听特定端口的客户端连接请求,并在有新的连接请求时创建新的Socket实例与之通信。通过各种选项和方法,开发人员可以根据需要定制服务器的行为,例如设定超时时间、调整接收数据的缓冲区大小等。


       2.常用方法:
构造方法:用于创建服务器套接字实例,可以绑定到指定的端口。
accept():该方法用于侦听并接受到此套接字的连接,它会在连接传入之前一直阻塞。
setSoTimeout(int timeout):设置超时时间,以毫秒为单位。必须在进入阻塞前调用这个方法才能生效,一旦超时,程序会触发SocketTimeoutException异常。
setReuseAddress(boolean on):设置是否允许重用服务器绑定的地址。
setReceiveBufferSize(int size):设置接收数据缓冲区的大小。


       3.各种构造函数:
ServerSocket():创建一个未绑定端口的ServerSocket实例。需要后续调用bind()方法将其绑定到特定端口上。
ServerSocket(int port):创建一个绑定到指定端口的ServerSocket实例。如果端口号为0,则系统会随机分配一个空闲端口。
ServerSocket(int port, int backlog):创建一个绑定到指定端口的ServerSocket实例,并设置客户端连接请求队列的长度。backlog参数定义了在拒绝连接之前可以排队的最大客户端数量。
ServerSocket(int port, int backlog, InetAddress bindAddr):创建一个绑定到指定端口和IP地址的ServerSocket实例,并设置客户端连接请求队列的长度。这允许服务器在多网卡的机器上选择特定的网络接口来监听客户端的连接请求。

      4.如果我们不使用ServerSocket的accept();方法。会发生什么?
当ServerSocket监听到端口的请求信息,而没有使用accept方法调用则会将请求挂起加入到队列中,等待被调用。


      5.这个队列是哪里来的?可以自己设定长度吗?
这个队列一般是由操作系统管理的。可以,我可以通过在创建ServerSocket时指定new ServerSocket(port, backlog);通过backlog


      6.自己设定的长度能能长过操作系统默认的吗?如果超了长度会发生什么?
不能,如果自己设定的长度超过系统长度,或者小于等于0,又或者不设置,它会按照系统默认的长度。

二、Socket:
       1.介绍
Socket是网络编程中的一个基本概念,它是一组编程接口(API),用于在网络中不同进程之间进行通信。Socket是对TCP/IP协议的封装和应用,它提供了一组函数,使得程序员可以不必深入了解底层的TCP/IP协议细节,就能实现网络通信。


        2.常用方法:
socket():创建一个新的Socket实例,是进行网络通信的起点。
bind():将Socket绑定到一个特定的IP地址和端口上,这通常用于服务器端,以便客户端可以找到并连接到服务器。
listen():使服务器端的Socket进入监听状态,准备接受客户端的连接请求。
connect():用于客户端,向服务器发起连接请求。
accept():服务器端接受客户端的连接请求,并返回一个新的Socket,用于与客户端通信。
read()/write():用于从Socket接收数据或向Socket发送数据。
close():关闭Socket,结束网络通信。


        3.各种构造函数:
Socket():创建一个未连接的套接字,使用系统默认的套接字类型和协议。
Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定的IP地址和端口号。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort):创建一个套接字并将其连接到指定的远程地址上的指定远程端口,同时指定本地地址和端口。
Socket(Proxy proxy):创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。
Socket(SocketType socketType, ProtocolType protocolType):使用指定的套接字类型和协议初始化Socket类的新实例。
Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType):使用指定的地址族、套接字类型和协议初始化Socket类的新实例。

三、如果我不使用accept方法那么哪些监听到的socket会排在队列中吗?

在Java中,ServerSocket 类的 accept() 方法是用来监听并接受客户端连接的。当一个客户端尝试连接到服务器时,如果服务器未调用 accept() 方法来接受这个连接,那么这个连接会处于挂起状态,等待服务器处理。在操作系统层面,有一个队列(通常称为“backlog queue”或“listen queue”)用来存储这些等待被接受的连接。这个队列的大小通常是可配置的,并且受到操作系统和 ServerSocketbacklog 参数的限制。当 ServerSocket 创建时,可以指定 backlog 参数的值,该值表示在开始拒绝新的连接之前,允许排队的最大连接数。如果 backlog 设置为非负数,则表示最大队列长度;如果设置为 -1,则队列大小没有限制,取决于操作系统的限制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值