精华内容
下载资源
问答
  • 通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个。通常,套接字采用客户机-服务器架构。服务器通过监听指定端口,来等待客户请求。服务器在收到请求后,接受来自客户套接字的连接,从而完成连接。...

    为通信的端点,每个套接字由一个 IP 地址和一个端口号组成。通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个。

    通常,套接字采用客户机-服务器架构。服务器通过监听指定端口,来等待客户请求。服务器在收到请求后,接受来自客户套接字的连接,从而完成连接。

    实现特定服务(如 telnet、ftp 和 http)的服务器监听众所周知的端口(telnet 服务器监听端口 23,ftp 服务器监听端口 21,Web 或 http 服务器监听端口 80)。所有低于 1024 的端口都是众所周知的,我们可以用它们来实现标准服务。

    当客户进程发出连接请求时,它的主机为它分配一个端口。这个端口为大于1024的某个数字。例如,当 IP 地址为 146.86.5.20 的主机 X 的客户希望与 IP 地址为 161.25.19.8 的 Web 服务器(监听端口 80)建立连接时,它所分配的端口可为1625。该连接由一对套接字组成:主机 X 上的(146.86.5.20:1625), Web服务器上的(161.25.19.8:80)。这种情况如图 1 所示。根据目的端口号码,主机之间传输的分组可以发送到适当的进程。

    33ce69e4e44c24caf46a27f0d3a7e5e0.gif

    图 1 采用套接字的通信

    所有连接必须是唯一的。因此,当主机 X 的另一个进程希望与同样的 Web 服务器建立另一个连接时,它会分配到另一个大于 1024 但不等于 1625 的端口号。这确保了所有连接都由唯一的一对套接字组成。

    为了演示套接字,本节我们会用 Java 语言,因为 Java 提供一个更加简单的套接字接口而且提供丰富的网络工具库。

    Java 提供三种不同类型的套接字:

    面向连接的 TCP 套接字是用 Socket 类实现的;

    无连接的 UDP 套接字使用 DatagramSocket 类。

    MulticastSocket 类为 DatagramSocket 类的子类,多播套接字允许数据发送到多个接收者。

    下面的例子,即日期服务器,采用面向连接的 TCP 套接字。这个操作允许客户机向服务器请求当前的日期和时间。服务器监听端口 6013,当然端口号可以是任何大于 1024 的数字。在接收到连接时,服务器将日期和时间返回给客户机。

    import java.net.*;

    import java.io.*;

    public class DateServer

    {

    public static void main(String[] args) {

    try {

    ServerSocket sock = new ServerSocket(6013);

    /* now listen for connections */

    while (true) {

    Socket client = sock.accept();

    PrintWriter pout = new PrintWriter(client.getOutputStream(),true);

    /* write the Date to the socket */

    pout. println (new java.util.Date().toString());

    /* close the socket and resume */

    /* listening for connections */

    client.close();

    }

    }

    catch (IOException ioe) {

    System.err.println(ioe);

    }

    }

    }

    此程序为日期服务器程序。服务器创建一个 ServerSocket,监听端口号 6013,然后调用 accept() 方法,开始监听端口。服务器阻塞在方法 accept() 上,等待客户请求连接。当接收到连接请求时,accept() 返回一个套接字,以供服务器与客户进程进行通信。

    服务器如何与套接字通信的有关细节如下。服务器首先建立 PrintWriter 对象,以便与客户进行通信。PrintWriter 对象允许服务器通过输出方法 print() 和 printin() 写到套接字。服务器通过方法 println() 发送日期到客户机。服务器在将日期写到套接字后,就关闭与客户相连的套接字,并且重新监听更多请求。

    为与服务器通信,客户创建一个套接字,并且连到服务器监听的端口。以下的 Java 程序为客户机的实现。

    import java.net.*;

    import java.io.*;

    public class DateClient {

    public static void main(String[] args) {

    try {

    /* make connection to server socket */

    Socket sock = new Socket("127.0.0.1",6013);

    InputStream in = sock.getInputStreamO ;

    BufferedReader bin = new BufferedReader(new InputStreamReader(in));

    /* read the date from the socket */

    String line;

    while ( (line = bin.readLine()) != null)

    System.out.printIn(line);

    /* close the socket connection*/

    sock.close() ;

    }

    catch (IOException ioe) {

    System.err.printIn(ioe);

    }

    }

    }

    客户创建一个 Socket,并与 IP 地址为 127.0.0.1 的服务器端口 6013 建立连接。连接建立后,客户就通过普通的流 I/O 语句来从套接字进行读取。在收到服务器的日期后,客户就关闭端口,并退出。

    IP 地址 127.0.0.1 为特殊 IP 地址,称为回送。当计算机采用地址 127.0.0.1 时,它引用自己。这一机制允许同一主机的客户机和服务器可以通过 TCP/IP 协议进行通信。IP 地址 127.0.0.1 可以换成运行日期服务器的另一主机的 IP 地址。除 IP 地址外,也可采用如 www.westminstercollege.edu 这样实际的主机名。

    使用套接字的通信,虽然常用和高效,但是属于分布式进程之间的一种低级形式的通信。原因是套接字只允许在通信线程之间交换无结构的字节流。客户机或服务器程序需要自己加上数据结构。

    展开全文
  • 一、套接字(Scoket)的引入Java支持基于流的通信和基于包的通信。基于流的通信使用传输控制协议(TCP)进行数据传输,而基于包的通信使用用户数据报...套接字可以使得程序很方便地访问TCP/IP,为了能够方便地开发网络...

    一、套接字(Scoket)的引入

    Java支持基于流的通信和基于包的通信。基于流的通信使用传输控制协议(TCP)进行数据传输,而基于包的通信使用用户数据报协议(UDP)。因为TCP协议能够发现丢失的传输信息并重新发送,所以传输过程是无损的和可靠的。相对而言,UDP协议不能保证传输没有丢失。因此,大多数Java程序设计采用基于流的通信。

    套接字可以使得程序很方便地访问TCP/IP,为了能够方便地开发网络应用,Java API提供了用于创建套接字的类来进行程序的网络通信。套接字是两台主机之间逻辑连接的端点,可以用来接收和发送数据。Java对于套接字通信的处理非常类似于对输入输出操作的处理,因此程序对套接字读写就像对文件读写一样容易。

    网络程序设计通常设计一个服务器端和一个或多个客户端。客户端向服务器端发送请求,而服务器端响应请求。客户端从尝试建立与服务器的连接开始,服务器可能接受或者拒绝这个连接。一旦建立连接,客户端和服务器端就可以通过套接字进行通信。

    二、服务器套接字

    要创建一个服务器,需要创建一个服务器套接字(Server Socket),并把它附加到一个端口上,服务器从这个端口监听连接。端口套接字上的TCP服务。端口号的范围是从0到65536,但是0到1024是系统保留的端口号。比如,电子邮件服务器运行在端口25上,web服务器通常运行在端口80上。

    可以选择任意一个当前没有被其他进程使用的端口。使用下面的语句创建一个服务器套接字,参数8000表示服务器端使用的接口:ServerSocket ss = new ServerSocket(8000);

    三、客户端套接字

    创建服务器套接字以后,服务器可以通过使用下面的语句监听连接:Socket socket = ss.accept();

    这个语句会一直等待,直到一个客户端连接到服务器套接字。客户端执行下面的语句,请求与服务器进行连接:Socket s = new Socket(serverName, port);

    这条语句打开一个套接字,使得客户端程序能够与服务器进行通信。其中serverName是服务器的互联网主机名或IP地址。

    四、通过套接字进行数据传输

    服务器接受连接以后,服务器和客户端之间的通信就可以像输入输出流一样进行操作。但是对于客户端和服务器端而言输入流或输出流是相对的。

    D2h5MjpMPbog7hKYSUG3jV.png

    对于客户端而言,接收服务器端的数据是输入流,向服务器端发送数据是输出流;对于服务器端来说,向客户端发送数据是输出流,接收客户端发送的数据是输入流。为了获得输入流或者输出流,可以使用套接字对象的getInputStream()方法和getOutputStream()方法。

    下面通过一个完整的例子来学习如何使用Socket进行客户端和服务器端之间的数据传输://服务器端

    public class Server {

    public static void main(String[] args) {

    try {

    ServerSocket ss = new ServerSocket(8000);

    Socket socket = ss.accept();

    //向客户端发送数据

    OutputStream os = socket.getOutputStream();

    DataOutputStream dos = new DataOutputStream(os);

    dos.writeUTF("login");

    //接收客户端数据

    InputStream is = socket.getInputStream();

    DataInputStream dis = new DataInputStream(is);

    System.out.println("接收到客户端数据:" + dis.readUTF());

    //向客户端发送数据

    dos.writeUTF("login successful");

    //关闭流

    is.close();

    dis.close();

    os.close();

    dos.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    //客户端

    public class Client {

    public static void main(String[] args) {

    try {

    //请求连接服务器

    Socket s = new Socket("127.0.0.1", 8000);

    //接收服务器数据

    InputStream is = s.getInputStream();

    DataInputStream dis = new DataInputStream(is);

    System.out.println("接收到服务器数据:" + dis.readUTF());

    //向服务器端发送数据

    OutputStream os = s.getOutputStream();

    DataOutputStream dos = new DataOutputStream(os);

    dos.writeUTF("java");

    //接收服务器数据

    System.out.println("接收到服务器数据:" + dis.readUTF());

    //关闭流

    is.close();

    dis.close();

    os.close();

    dos.close();

    } catch (UnknownHostException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    运行此实例,需要打开两个Eclipse,分别运行Server端和Client端,并保证先执行Server端,在执行Client端。

    Server端执行结果:

    接收到客户端数据:java

    Client端执行结果:

    接收到服务器数据:login

    接收到服务器数据:login successful

    整个程序执行流程如下图所示:

    vmKEcibEMDqTdes8c7ndiE.png

    展开全文
  • 在C语言中,如果写一个与网络通信的程序,就需要新的数据流-套接字套接字是双向的,既可以输入也可以输出1.使用socket()函数创建一个套接字数据流#include int xxxx = socket(PF_INET, SOCK_STREAM, 0);xxxx是套接...

    所有程序都需要编写检查错误的代码

    一.基础知识

    客户端与服务器之间将展开一段结构化对话,叫协议。

    在C语言中,如果写一个与网络通信的程序,就需要新的数据流-套接字,套接字是双向的,既可以输入也可以输出

    1.使用socket()函数创建一个套接字数据流

    #include

    int xxxx = socket(PF_INET, SOCK_STREAM, 0);

    xxxx是套接字名字

    套接字与客户端程序通信,服务器需要经历,绑定端口,监听,接受连接,开始通信,四个阶段

    服务启动时,服务器会为每项服务分配一个端口,服务器启动时,需要告诉操作系统将要使用哪个端口,这个过程叫做端口绑定。

    2.这些代码将创建一个表示"互联网xxx端口"的套接字名

    #include

    struct sockeaddr_in xxxx;

    xxxx.sin_family = PF_INET;

    xxxx.sin+port = (in_port_t)htons(端口号);

    xxxx.sin_addr.s_addr = htonl(INADDR_ANY);

    int x = bind (套接字名字, (struct sockaddr * ) &xxxx, sizeof(name));

    3.设置客户端连接服务器的排队数量

    listen(套接字名字, xx)

    xx为人数

    在linux操作系统的/etc/services文件中可以查看常用服务使用的端口号

    4.保存连接客户端的详细信息

    struct sockaddr_storage xxxx;

    unsigned int address_size = sizeof(client_addr);

    int connect_d = accept(listener_d, (struct sockaddr *) &client_addr, &address_size);

    套接字的输出方法:

    二.使用send()函数写数据

    send(套接字名称, xxxx, strlen(xxx), 0)

    xxx和strlen(xxx)是消息和消息长度

    0是高级参数填0即可

    绑定端口有延时的解决办法,当使用某个端口绑定了套接字后,在接下来的30秒内,操作系统不允许任何程序绑定它,包括上次绑定这个端口的程序,我们在绑定前设置套接字的某个选项,就可以解决这个问题了。

    int reuse = 1;

    setsockopt(套接字名字, SQL_SOCKET, SO_REUSEADDR, (char * )&reuse, sizeof(int));

    三.使用recv()函数读数据

    recv (接收的描述符,字符变量的缓冲区,, 0);

    1.字符串不以\0结尾

    2.当用户在客户端输入文本时用\r\n结尾

    3.recv()将返回字符个数,如果发生错误就返回-1,如果客户端关闭连接就返回0

    4.recv调用不一定能一次接收所有字符,需要配合循环,读取字符。

    例如:

    int read_in (int socket, char * buf, int len)

    {

    int c = recv(socket, buf, len, 0);

    }

    四.为每个客服端复制一份子进程

    服务器在运行一份套接字进程给第一个用户时,无法运行第二个进程给第二个用户,因此使用fork()为每个用户创建一个子进程。

    服务器父进程只需要用主监听套接字,因此关闭副套接字,子进程需处理副套接字,关闭主监听套接字

    五.创建ip地址套接字

    1.客户端套接字的创建:

    int xxx = socket (PF_INET, SOCK_STREAM, 0);

    2.客户端和服务器处理套接字的方法不同,服务器会把套接字绑定到本地端口,而客户端会把套接字连接至远程端口。

    struct sockaddr_in xxx;

    memset(&xxx, 0, sizeof(xxx));

    xxx.sin_family = PF_INET;

    xxx.sin_addr.s_addr = inet_addr("ip地址");

    xxx.sin_port = htons(端口号);

    connect(xxx, (struct sockaddr *) &xxx, sizeof(xxx)); 连接套接字至远程端口

    六.使用域名创建套接字

    域名系统,计算机发送数据包时需要在地址一栏填写数字形式的ip地址,而dns可以把域名转化为ip地址

    创建域名套接字:

    #include

    struct addrinfo * xxx;

    struct addrinfo xxxx;

    memset(&xxxx, 0, sizeof(xxxx));

    xxxx.ai_family = PF_UNSPEC;

    xxxx.ai_socktype = SOCK_STREAM;

    getaddrinfo("域名", "端口", &xxxx, &xxx);

    getaddrinfo会在堆上创建一个xxx名字的新数据结构给定域名和端口号。

    随后创建套接字

    int x = socket(xxx->ai_family, xxx->ai_socktype, xxx->ai_protocal);

    connect(x, xxx->ai_addr, xxx->ai_addrlen);

    freeaddrinfo(xxx);连接以后删除地址数据

    展开全文
  • linux查看网络套接字使用统计

    cat /proc/net/sockstat 这个命令可以查看网络使用了多少套接字

    展开全文
  • 原始套接字

    2021-03-10 06:08:05
    原始套接字:是一种对原始网络报文进行处理的套接字,主要用途有:l 发送自定义的IP数据包l 发送ICMP数据包l 网卡的侦听模式,监听网络上的数据包l 伪装IP地址l 自定位协议的实现原始套接字主要应用于底层...
  • Linux网络编程——常用套接字函数

    千次阅读 2021-11-03 09:54:47
    常用套接字函数整理 基础套接字函数入门1 套接字函数及其理解 socket()函数用法详解:创建套接字 socket()函数   函数功能:在某协议簇的某协议中创建一个套接字(socket)【创建socket数据结构分配存储空间】。 ...
  • 3e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init: Version: 0.18.0 GitCommit: fec3683 docker在开启网络套接字,默认是没有任何验证的,需要安全配置,否则会很危险,生产中也不会使用网络套接字来管理所有...
  • 网络套接字编程 套接字 socket , 也可以做进程间通信(ROS) TCP协议通信 (传输层协议)安全可靠传输协议, 需要先建立链接才进行收发数据 优点 : 安全,协议层会校验, 缺点:实时性差, 粘包问题(数据流) ...
  • 套接字编程原理

    2021-02-26 18:14:54
    6、多路复用——select() 功能:用来检测一个或多个套接字状态。 格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout)...
  • 创建套接字并将其绑定到服务器所使用的熟知地址上。 重复调用accept接收客户端的请求,并且创建子线程处理响应。 子线程: 在线程创建时接收连接请求; 用该连接与客户端进行交互:接收请求并发回应答; 关闭连接并...
  • 摘要:本文涵盖了有关使用Python进行套接字编程的所有领域。套接字可以帮助您建立这些连接,而Python无疑可以简化连接。
  • Java套接字编程(上)

    2021-03-06 01:19:13
    在这篇文章中我们将介绍套接字(Socket)慨念,同时以实例说明如何使用Network API操纵套接字,在完成本文后,你就可以编写网络低端通讯软件。什么套接字(Socket)?Network API是典型的用于基于TC...
  • 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三...
  • Linux网络编程(套接字编程)

    千次阅读 2021-05-15 15:24:47
    socket套接字编程 udp协议与tcp协议区别 udp协议: udp协议:用户数据报协议 特性:无连接,不可靠,面向数据报 应用场景:实时性要求大于安全性(类似于短信发送)eg.视频传输 tcp协议: tcp...
  • 什么套接字?

    2021-07-16 08:29:26
    套接字通常指的是封装了ip和port的结构体。主要对进程间通信或者网络通信的抽象。比如我们建立一个tcp连接,本质上就是两端都有一个套接字,记录了源ip,端口和目的ip,端口。真正套接字的实现其实还比较复杂,可以...
  • socket函数用于创建一个套接字,这是在应用层调用的,所以应用程序需要在调用socket创建套接字时根据应用层的业务类型,指定它所希望采用的网络层、传输层所使用的的协议。 内核中套接字是一层一层进行抽象展示的,...
  • 100-网络编程——第五章流式套接字

    千次阅读 2021-11-21 21:48:49
    一:TCP协议的传输特点 1.TCP协议是一个面向连接...②建立可靠连接:TCP要求客户在应用程序在于服务器交换数据前,先要连接服务器,保证连接可靠建立,建立连接测试了网络的连通性,如果有故障发生,阻碍分组到达远端系
  • 摘要tcp套接字是一个端点。实例在特定TCP连接或侦听状态的上下文中由IP地址和端口定义。端口是虚拟化标识符。定义服务端点(与服务不同)实例端点,也就是会话标识符)。TCP套接字是不连接,它是特定连接的端点。可以有...
  • close(关闭套接字

    2021-08-19 14:16:00
    1、使用close函数即可关闭套接字 关闭一个代表已连接套接字将导致另一端接收到一个0长度的数据包 2、做服务器时 1>关闭监听套接字将导致服务器无法接收新的连接,但不会影响已经建立的连接 2>关闭accept返回的...
  • 我们知道TCP和UDP是使用不同的套接字标识符来实现分用和复用,TCP使用四元组(源IP,源端口,目标IP,目标端口)来标识一个TCP套接字,而UDP使用的是二元组(源端口,目标端口)来标识。 在这里我们不妨思考一个问题...
  • socket套接字的参数

    千次阅读 2021-12-01 19:30:01
    UDP 套接字 使用Ipv4 的协议族(PF_INET),和⾯向消息的数据传输(SOCK_DGRAM),对应第三个参数只能是IPPROTO_UDP int udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); TCP 套接字 使用Ipv4 的协议族...
  • 一 理解网络编程和套接字

    千次阅读 2021-12-13 16:53:41
    第一章 理解网络编程和套接字 重点是套接字使用:几个函数 socket() bind() listen() accept() connect() 几个函数的使用: socke函数的使用: #include <sys/socket.h> int socket(int domain,int type,...
  • 网络编程套接字

    热门讨论 2021-05-11 22:36:05
    1、什么网络字节序? 2、网络字节序和主机字节序转换相关接口 四、socket变成 一、IP地址和端口号 1、源IP地址和目的IP地址 IP协议是工作在网络层的协议,负责地址管理和路由选择的。当数据传输到网络层时,...
  • 套接字的绑定bind和监听设置listen套接字的绑定简介函数原型如何绑定设置监听套接字进入监听状态函数原型代码示例 本文记录bind()和listen()环节 套接字的绑定 简介 bind 函数用在没有建立连接的套接字上,它的作用...
  • 1.2网络层原始套接字 1.2.1 接收报文 1.2.2 发送报文 2 原始套接字实现 2.1原始套接字报文收发流程 2.2链路层原始套接字的实现 2.2.1套接字创建 2.2.2报文接收 2.2.3报文发送 2.2.4 小结 2.3网络层原始...
  • Socket套接字详解

    2021-07-25 13:29:07
    文章目录什么套接字套接字的表示方法套接字工作流程 什么套接字 套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一个套接字就是网络上进程通信的一端,提供了应用层进程利用...
  • 网络套接字socket编程

    2021-11-18 18:10:50
    socket套接字编程 协议 udp协议:用户数据报协议 特性:无连接,不可靠,面向数据报 应用场景:实时性要求大于安全性要求的场景。 tcp协议:传输控制协议 特性:面向连接,可靠传输,面向字节流 应用场景:安全性要求...
  • 进程、端口与套接字

    千次阅读 2021-07-28 21:11:12
    话不多说,直接入题: 进程: 具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 如一个QQ对应一个进程。...套接字上联应用进程,下联网络协议栈,是应用
  • 端口和套接字

    2020-12-21 19:24:09
    端口(Port):一台计算机只有单一的连接到网络的物理连接,所有的数据都通过此连接对内、外送达特定的计算机。端口并非真实的物理存在,而是一个假象的连接装置...套接字(Socket):用于将应用程序与端口连接起来。 ...
  • 如果不将服务器端的IP地址和端口号绑定到网络,客户端就无法找到该服务器端,无法进行请求。 因为,如果不绑定则会随机给服务器端分配一个端口号和IP地址,客户端也不知道这个端口号和IP地址。因此,需要将服务器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 383,968
精华内容 153,587
关键字:

为什么使用网络套接字