`

Socket基本概念

阅读更多
服务器运行的时候可以监听多个客户端的连接请求。管理客户连接请求的任务是由操作系统来完成的。操作系统把这些连接请求存储在一个先进先出的队列中。许多操作系统限定了队列的最大长度,一般为50。当队列中的连接请求达到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。只有当服务器进程通过ServerSocket 的accept()方法从队列中取出连接请求,使队列腾出空位时,队列才能继
续加入新的连接请求。
    如果客户进程发出的连接请求被服务器拒绝,Socket 构造方法就会抛出
ConnectionException。

例如:如下测试代码
public class Client {
  public static void main(String args[])throws Exception{
  final int length=100;
  String host="localhost";
  int port=8080;
  Socket[] sockets=new Socket[length];
  for(int i=0;i<length;i++){ //试图建立100 次连接
  sockets[i]=new Socket(host, port);
  System.out.println("第"+(i+1)+"次连接成功");
  }
  Thread.sleep(3000);
  for(int i=0;i<length;i++){
    sockets[i].close(); //断开连接
   }
  }
}



public class Server {
  private int port=8000;
  private ServerSocket serverSocket;
  public Server() throws IOException {
    serverSocket = new ServerSocket(port,3); //连接请求队列的长度为3
    System.out.println("服务器启动");
  }
  while (true) {
    Socket socket=null;
    try {
      socket = serverSocket.accept(); //从连接请求队列中取出一个
连接
       System.out.println("New connection accepted " +
      socket.getInetAddress() + ":" +socket.getPort());
     }catch (IOException e) {
        e.printStackTrace();
     }finally {
       try{
       if(socket!=null)socket.close();
       }catch (IOException e) {e.printStackTrace();}
     }
   }
}

public static void main(String args[])throws Exception {
Server server=new Server();
Thread.sleep(60000*10); //睡眠10 分钟

}
}


运行以上测试程序,执行结果为:
第1 次连接成功
第2 次连接成功
第3 次连接成功
Exception in thread "main" java.net.ConnectException: Connection refused: connect.....................


如果在测试方法代码最后加上一句server.service();运行结果为
第1 次连接成功
第2 次连接成功
第3 次连接成功

第100 次连接成功   ,可以看到100次连接可以成功获得建立


绑定IP地址:
如果主机只有一个IP 地址,那么默认情况下,服务器程序就与该IP 地址绑定。ServerSocket 
构造方法ServerSocket(int port, int backlog, InetAddress bindAddr)有一个bindAddr 参数,它显式指定服务器要绑定的IP 地址,该构造方法适用于具有多个IP 地址的主机。假定一个主机有两个网卡,一个网卡用于连接到Internet, IP 地址为222.67.5.94,还有一个连接到本地局域网,IP 地址为192.168.3.4。如果服务器仅仅被本地局域网中的客户访问,那么可以按如下方式创建ServerSocket:
ServerSocket serverSocket=new ServerSocket(8000,10,InetAddress.getByName("192.168.3.4"));


默认构造:
ServerSocket 有一个不带参数的默认构造方法。通过该方法创建的
ServerSocket 不与任何端口绑定,接下来还需要通过bind()方法与特定端口绑
定。这个默认构造方法的用途是,允许服务器在绑定到特定端口之前,先设置
ServerSocket 的一些选项。因为一旦服务器与特定端口绑定,有些选项就不能
再改变了。

ServerSocket serverSocket=new ServerSocket();
serverSocket.setReuseAddress(true); 
serverSocket.bind(new InetSocketAddress(8888));

这样设置是有效的,但是如果吧第二句和第三句位置互换就失效了。


当服务器正在进行发送数据的操作时,如果客户端断开了连接,那么服务器端会抛出一个IOException的子类SocketException 异常:
java.net.SocketException: Connection reset by peer
这只是服务器与单个客户通信中出现的异常,这种异常应该被捕获,使得服务器能继续与其他客户通信。

while (true) {
Socket socket=null;
try {
socket = serverSocket.accept(); //从连接请求队列中取出一个连接
System.out.println("New connection accepted " +
socket.getInetAddress() + ":" +socket.getPort());
//接收和发送数据
…
}catch (IOException e) {
//这只是与单个客户通信时遇到的异常,可能是由于客户端过早断开连接引起的
//这种异常不应该中断整个while 循环
e.printStackTrace();
}finally {
try{
if(socket!=null)socket.close(); //与一个客户通信结束后,要关闭
Socket
}catch (IOException e) {e.printStackTrace();}
}
}



ServerSocket 有以下3 个选项。
1.SO_TIMEOUT:表示等待客户连接的超时时间。
2. SO_REUSEADDR:表示是否允许重用服务器所绑定的地址。
3. SO_RCVBUF:表示接收数据的缓冲区的大小。


当服务器执行ServerSocket 的accept()方法时,如果连接请求队列为空,服务
器就会一直等待,直到接收到了客户连接才从accept()方法返回。如果设定了
超时时间,那么当服务器等待的时间超过了超时时间,就会抛出
SocketTimeoutException,它是InterruptedException 的子类。



SO_RCVBUF 表示服务器端的用于接收数据的缓冲区的大小,以字节为单位。一般
说来,传输大的连续的数据块(基于HTTP 或FTP 协议的数据传输)可以使用较
大的缓冲区,这可以减少传输数据的次数,从而提高传输数据的效率。而对于交
互式的通信(Telnet 和网络游戏),则应该采用小的缓冲区,确保能及时把小
批量的数据发送给对方。








分享到:
评论

相关推荐

    通过socket实现webservice的功能.rar

    1、Socket基本概念 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求, Socket本质是编程接口(API),是对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket...

    java socket学习

    socket的基础学习代码,用于认识和学习socket的基本概念。包括TCP和UDP。

    C++中socket编程基础详解

    介绍了SOCKET的基本概念,详细讲解了客户端跟服务端的实现。

    UNIX Socket编程

    介绍 UNIX Socket编程的基本概念及函数说明

    应用SOCKET实现网络通信

    介绍了SOCKET编程的基本概念,详细说明了SOCKET编程的一些注意事项,应用SOCKET实现异步通信和组广播技术,列举了应用SOCKET编程过程中的几点想法,对实际应用有较强的指导作用。

    有关java线程循环和serversocket和socket的程序借鉴.pdf

    有关java线程循环和serversocket和socket的程序借鉴.pdf

    Linux环境下的嵌入式系统网络编程应用

    Linux支持多种类型的套接字地址簇并将其抽象为统一的套接字接口,这一抽象的引入是为了方便互联网应用程序的编程,也为网络应用程序...该文从socket基本概念入手,介绍了网络编程的基本模式及Linux内核对socket的支持。

    中国科学技术大学TCP/IP Socket网络编程的PPT

    包括以下内容: 1、Internet与TCP/IP协议 2、TCP/IP协议体系结构与OSI模型 3、Socket编程接口 4、Windows Socket 5、Linux Socket 6、TCP/IP网络程序框架与示例 ...是一些基本概念的介绍,初学者可下。

    实战LinuxSocket编程

    比如第一部分“基本套接口概念”在阐明域和地址族、套接口的类型以及面向连接/非连接协议等基本概念的基础上,介绍了简单的客户/服务器程序的编写方法和主机名/网络名查询程序的编写方法。在掌握了第一部分“基本...

    细细品味C#(Socket编程).pdf

    2.2.1 基本概念和操作 2.2.2 同步传输字符串 2.2.3 异步传输字符串 2.2.4 订立协议和发送文件 2.2.5 接收文件 3、Scoket 处理HTTP请求响应 3.1、版权声明 3.2、内容详情 4、浅谈C# Socket编程及多线程 4.1...

    细细品味C#(Socket编程).pdf

    通过创建一个简单的聊天程序,可以了解 Socket 编程的基本概念和操作。聊天程序的实现可以分为客户端和服务器端两个部分。客户端负责发送消息,而服务器端负责接收和处理消息。通过使用 Socket 编程,可以实现实时的...

    C# Socket多线程编程实例

    本文主要介绍了C#语言在网络编程方面的应用,特别是套接字编程的基本概念和实现原理。套接字是一种通信的基石,支持TCP/IP协议的网络通信的基本操作单元。我们可以将套接字看作不同主机间的进程进行双向通信的端点,...

    socket通信与串口通信(二选择一)

    Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、...

    Socket 简易入门

    介绍了socket的基本概念,并提供了socket的实现例子。通过本文的学习,基本上可以使用socket。

    tcp socket同步 异步 阻塞 非阻塞 的解释.zip

    tcp socket同步 异步 阻塞 非阻塞 的解释.zip 基本概念:同步、异步、阻塞和非阻塞的区别 同步异步与阻塞非阻塞的区别 C++ 同步异步与阻塞非阻塞的区别

    socket编程原理

    socket编程原理,socket的一些基本概念和编程方法

    node-TcpSocket:节点 TCP 套接字客户端服务器通信基本概念

    node-TcpSocket 客户端/服务器通信基本概念该代码简单地使用节点 TCP 网络服务器和 Socket 对象来创建客户端和服务器之间的通信流。 这个基本概念正在 express/socket.io 框架中用于构建聊天应用程序测试应用在终端...

    TCP-IP Socket网络编程.ppt

    在本文中,我们将详细介绍 TCP/IP Socket 网络编程的概念、类型、应用场景、编程接口、常用函数等。 Socket 是一种独立于具体协议的网络编程接口,在 ISO 模型中主要位于会话层和传输层之间。BSD Socket 是通过标准...

    信息安全基础知识简介(浅析一些基本概念)

    这里主要介绍了关于端口,socket , 进程 , 线程等一些基本概念

Global site tag (gtag.js) - Google Analytics