【问题标题】:what is socket in php? And at what condition i should go for socket connection?什么是 php 中的套接字?我应该在什么条件下进行套接字连接?
【发布时间】:2016-09-14 20:49:21
【问题描述】:

我已经阅读了一些关于套接字的教程,但我无法理解它的作用。我想知道套接字的作用以及为什么要使用它。这是我提到的代码。

client.php
<?php
$host    = "localhost";
$port    = 1024;
$message = "Hello Server";
echo "Message To server :".$message;
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create              socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to  server\n");  
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
// get server response
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
echo "Reply From Server  :".$result;
// close socket
socket_close($socket);
?>

server.php
<?php
// set some variables
$host = "localhost";
$port = 1024;
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
// read client input
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// clean up input string
$input = trim($input);
echo "Client Message : ".$input;
// reverse client input and send back
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write  output\n");
// close sockets
socket_close($spawn);
socket_close($socket);
?>

所以我不知道在哪里输入服务器代码和客户端代码。通常我们在获取用户输入的同时编写服务器代码。所以我对此感到非常困惑。谁能帮我?提前致谢

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它就在那里。
  • 如果有,你能建议它在哪里吗?这将是一个很大的帮助。
  • 谢谢@RyanVincent,这是一篇了解两台计算机如何通信的非常有用的文章。但他们没有说任何关于套接字的事情。那你能帮我吗?或者建议我任何文章来了解套接字以及如何实现它。我已经开发了一个聊天应用程序,我将从一个用户发送的消息保存到数据库并将其显示给另一个用户。页面将使用 ajax 刷新。所以我必须做些什么才能使聊天通过套接字编程运行。你能解释一下流程吗?

标签: php sockets


【解决方案1】:

为了理解套接字,我认为理解网络原理很重要。尤其是互联网协议和传输控制协议。

传输控制协议是一种将消息分解成更小块的方法,并以这样的方式寻址它们,使得这些块可以在接收端可靠地重新组装。 Internet 协议是通过 Internet 路由这些块的一种方式。

Socket 只是一个为您管理这些协议细节的编程对象。您将套接字配置为连接到给定 IP 地址上的给定端口。套接字管理其余部分:分块、打包和标记数据。套接字封装了所有协议细节,这样您就可以将它们抽象出来,就像您正在创建从一台计算机到另一台计算机的“连接”一样。作为开发人员,当您需要通过 Internet 与另一台计算机交换信息时,您会使用套接字。

在我学习计算机网络之前,对我来说,socket 的想法和它的用途是没有意义的。 (尤其是协议本身,不一定是实用的技术方面。)您可以从有关 TCP 和 IP 的 Wikipedia 文章开始。您可以尝试阅读网络上的个别零碎文章。但坦率地说,网络是一个如此巨大的话题,我认为没有一个连贯的、为期一学期的课程或一本高质量的教科书就足以真正回答这个问题(并纠正差距、过度简化和我用来保持这个答案简单的例外。)

【讨论】:

    【解决方案2】:

    我知道为时已晚,但我认为此链接将帮助其他任何想要了解何时使用 web socket 的人

    websocket

    【讨论】:

      【解决方案3】:

      您需要了解套接字编程的概念。为了获得更好的想法。

      套接字用于进程间通信。进程间 通信一般基于客户端-服务器模型。在这种情况下, 客户端-服务器是相互交互的应用程序。 客户端和服务器之间的交互需要连接。插座 编程负责在两者之间建立连接 应用程序进行交互。

      客户端应用程序将消息($message)发送到服务器($host)和 服务器应用程序通过端口($port)从客户端接收它。

      client.php 运行并从客户端机器发送消息。 server.php 在接收消息的服务器机器上运行。

      尝试这些链接以获取示例以及如何运行服务器和客户端文件。

      http://www.binarytides.com/php-socket-programming-tutorial/
      http://www.devshed.com/c/a/php/socket-programming-with-php/

      【讨论】:

      • "client.php 运行并从客户端机器发送消息。server.php 在接收消息的服务器机器上运行。"由于 php 是一种服务器端脚本语言,我们编写服务器端脚本,客户端代码应该写在哪里?什么是需要使用套接字?使用套接字编程有什么好处,在什么情况下可以使用?你能解释一下这些事情吗?
      • php 是一种用于 Web 编程的服务器端脚本语言。在套接字编程等情况下,php 可以用作通用编程语言。一个常见的例子是使用套接字编程的聊天应用程序。在这种情况下,client.php 由登录聊天的用户使用,server.php 将接收一个用户发送的聊天消息并将其路由给另一个用户。套接字实际上是一个端点,通过在建立连接后交换消息。 stackoverflow.com/questions/152457/…
      • 正是我必须在我的聊天应用程序中实现套接字编程。在那里我将保存从一个用户发送到数据库的消息并将其显示给另一个用户。页面将使用 ajax 刷新。所以我必须做些什么才能使聊天通过套接字编程运行。你能解释一下流程吗?在将数据保存到数据库或刷新页面时应该在什么时候实现套接字?
      • 还有一件事socket和websocket有什么区别?刚才我看到了这个。我尽可能多地浏览,但无法得到任何合适的答案。这些东西有什么区别,哪一个更好用?
      • 从客户端浏览器到服务器通信时将使用套接字。那是消息将在客户端和服务器之间传递的时候。一旦您在服务器上将消息保存到数据库中,就可以像往常一样完成。套接字仅用于在服务器和客户端/浏览器之间传递聊天消息。
      【解决方案4】:

      什么是套接字:

      套接字用于进程间通信。进程间通信通常基于客户端-服务器模型。客户端和服务器之间的交互需要连接。套接字编程负责在应用程序之间建立连接以进行交互。

      如何创建套接字:

      概念:

      第一步:设置“host”和“port”等变量

      $host = "127.0.0.1"; $port = 5353;

      第 2 步:创建套接字:

      $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

      第 3 步:将套接字绑定到端口和主机

      $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

      第 4 步:开始聆听

      $result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

      第 5 步:接受传入连接

      $spawn = socket_accept($socket) 或 die("无法接受传入连接\n");

      第 6 步:从客户端套接字读取消息

      $input = socket_read($spawn, 1024) or die("Could not read input\n");

      第 7 步:反转消息

      $output = strrev($input) 。 "\n";

      第 8 步:向客户端套接字发送消息

      socket_write($spawn, $output, strlen ($output)) 或 die("无法写入输出\n"); $output = strrev($input) 。 "\n";

      第 9 步:关闭连接

      socket_close($spawn); socket_close($socket);


      服务器端代码:

      // set some variables
      $host = "127.0.0.1";
      $port = 25003;
      // don't timeout!
      set_time_limit(0);
      // create socket
      $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
      // bind socket to port
      $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
      // start listening for connections
      $result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
      
      // accept incoming connections
      // spawn another socket to handle communication
      $spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
      // read client input
      $input = socket_read($spawn, 1024) or die("Could not read input\n");
      // clean up input string
      $input = trim($input);
      echo "Client Message : ".$input;
      // reverse client input and send back
      $output = strrev($input) . "\n";
      socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
      // close sockets
      socket_close($spawn);
      socket_close($socket);

      客户端代码:

      $host    = "127.0.0.1";
      $port    = 25003;
      $message = "Hello Server";
      echo "Message To server :".$message;
      // create socket
      $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
      // connect to server
      $result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");  
      // send string to server
      socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
      // get server response
      $result = socket_read ($socket, 1024) or die("Could not read server response\n");
      echo "Reply From Server  :".$result;
      // close socket
      socket_close($socket);

      【讨论】:

        猜你喜欢
        • 2013-12-11
        • 2013-01-24
        • 1970-01-01
        • 2013-01-27
        • 2010-12-16
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多