`

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 和网络游戏),则应该采用小的缓冲区,确保能及时把小
批量的数据发送给对方。








分享到:
评论

相关推荐

    三菱Q系列PLC之间SOCKET通讯详解.docx

    一、SOCKET基本概念 SOCKET,源自英文“插座”的意思,是一种计算机网络编程接口,它对TCP/IP协议进行了封装,使得开发者能够更便捷地使用网络协议进行数据传输。SOCKET并非一种协议,而是提供了与TCP/IP协议族交互...

    socket_test.zip_Linux下的socket_linux socket_linux socket server_l

    1. **Socket基本概念**: Socket是网络通信的基础,它是两台机器之间建立连接的接口。在Linux中,它是一个文件描述符,可以使用标准的I/O函数进行读写操作。 2. **socket函数创建**: 使用`socket()`函数创建一个...

    socketdemo 一个用来学习socket入门的例子

    1. **Socket基本概念**: - Socket在计算机网络中扮演着桥梁的角色,它允许两个远程应用程序通过网络交换数据。Socket分为服务器端Socket和客户端Socket,分别对应服务提供者和服务请求者。 - TCP(传输控制协议)...

    python:socket传输大文件示例

    1. **Socket基本概念**: - Socket是网络通信中的一个端点,它允许两台计算机通过网络交换数据。 - Python中的`socket`模块提供了创建和操作Socket的接口。 2. **Socket类型**: - `socket.SOCK_STREAM`:面向...

    Socket服务器和客户端

    一、Socket基本概念 Socket,也被称为套接字,是网络通信的一种接口,允许应用程序通过网络发送和接收数据。在TCP/IP协议栈中,Socket提供了进程间通信的能力,跨越了不同操作系统和网络环境的限制。Socket可以基于...

    C# Socket 客户端服务端封装带使用实例

    一、Socket基本概念 Socket,又称为套接字,是操作系统为应用程序提供的网络编程接口。它允许两个运行在网络中的程序通过网络进行通信,可以实现进程间的通信(IPC)或计算机间的通信(TCP/IP)。 二、C#中的Socket...

    简单Socket 聊天源码.

    1. **Socket基本概念** Socket,又称为“套接字”,是网络通信中的端点,它可以是两台计算机或者同一台计算机上的两个进程之间的通信接口。Socket提供了一种标准的API,使得开发者可以方便地在各种操作系统上编写...

    SocketTest.rar

    1. **Socket基本概念**: Socket,通常被称为套接字,是操作系统为网络通信提供的一种接口,它允许两个程序通过网络进行通信。在网络中,每个Socket由IP地址和端口号唯一标识,这样的组合被称为套接字地址。 2. **...

    c# socket 传输文件

    1. **Socket基本概念** - Socket是基于TCP/IP协议族的通信接口,它允许应用程序通过网络发送和接收数据。 - C#中的Socket类位于System.Net.Sockets命名空间下,提供了对TCP和UDP等网络协议的支持。 2. **TCP文件...

    单线程Socket编程实现mysql数据读取

    **Socket基本概念** Socket是进程间通信的一种方式,它提供了在网络中进行数据传输的端点。在TCP/IP协议栈中,Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP)。在这个案例中,我们使用的是流式Socket...

    Socket说明文档(英文版)

    ### Socket基本概念与Java应用详解 #### 一、Socket简介 **Socket** 是一种网络通信方式,它允许两台计算机之间进行数据交换。在互联网世界里,Socket 的历史远远早于 Java 语言的诞生,但 Java 使得 Socket 的...

    vc 2008 socket 通信

    一、Socket基本概念 Socket是操作系统提供的接口,它允许应用程序通过TCP/IP协议栈与其他系统进行通信。Socket分为两种主要类型:流式Socket(SOCK_STREAM,基于TCP)和数据报Socket(SOCK_DGRAM,基于UDP)。在VC ...

    java socket通信实现

    一、Socket基本概念 Socket通常被称为“套接字”,它是网络通信中的一个端点,用于标识一台机器上的特定进程。在TCP/IP协议中,每个Socket由IP地址和端口号唯一确定。Java的Socket类代表了一个TCP连接,而...

    socket源码及资料

    1. **Socket基本概念**: - Socket是应用层与传输层之间的接口,允许应用程序通过它发送和接收数据。 - Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP)。TCP提供面向连接的服务,数据传输可靠;UDP...

    简单的socket程序 可以直接编译运行

    一、Socket基本概念 Socket,通常称为套接字,是操作系统提供的通信接口,它允许不同的进程通过网络进行数据交换。在TCP/IP协议栈中,Socket分为两种类型:流式Socket(SOCK_STREAM,基于TCP)和数据报Socket(SOCK_...

    socket文件传输源码

    1. **Socket基本概念**: Socket,又称为“套接字”,是网络通信的基本单元,它提供了进程间通信(IPC)或网络进程间通信(Internet Protocol)的端点。在Unix系统中,socket是一种通信机制,允许不同进程之间通过...

    c++ socket通信库

    Socket基本概念 - **Socket接口**: 是操作系统提供的编程接口,用于在网络中建立和维护连接,进行数据传输。它将复杂的网络协议细节封装起来,使得程序员可以专注于应用程序的逻辑。 - **套接字(Socket)**: 是...

    tcl socket 编程实例

    #### 二、TCL Socket 基本概念 在开始之前,我们先了解几个基本的概念: - **Socket**:用于在两个节点之间建立连接并进行数据传输。 - **Server Socket**:服务器端的Socket,负责监听客户端的连接请求。 - **...

    用C++进行Socket编程

    一、Socket基本概念 Socket,又称为套接字,是网络通信中的端点,它允许两个或多个应用程序通过网络交换数据。在C++中,Socket编程主要涉及以下三个库:`#include &lt;sys/socket.h&gt;`、`#include &lt;netinet/in.h&gt;`和`#...

    C# Socket示例.rar

    一、Socket基本概念 Socket,通常被称为套接字,是网络通信中的一个抽象概念,它是两台机器间通信的端点。在C#中,Socket类位于System.Net.Sockets命名空间下,提供了创建、连接、发送和接收数据的方法。 二、TCP与...

Global site tag (gtag.js) - Google Analytics