| 
| 技术资料  > PHP技术 > 经典文章 : PHP套接字编程 |  
PHP套接字编程 March 23,2004 |  
  套接字编程,一般使用c或c++。特别的在web应用程序开发中,常用perl实现套接字。除此以外,用php进行套接字编程也是一个选择。Php可以胜任吗?当然可以。Php是一门高质量的web应用程序开发语言,他的许多特性可以处理众多的任务,网络编程也不例外。 
 
1. 理解套接字 
    Mail、ftp、telnet、name和finger这些服务都是在一个专用的公开的端口上提供的,通过连接到这些端口,客户程序就能够访问这些服务。这与现实生活是相似的——当需要干洗衣服的时候,找干洗店;当需要取钱的时候,去银行,等等。除了专用于特定服务器的端口外,计算机还有其它的端口让程序员创建他们自己的服务器。 
端口一般是编号的,通过指定服务器的端口号,客户程序可以连接到该端口上。每种服务器或端口要有特定的协议,为了让客户的请求能够被理解和响应,客户必须以这种服务器特有的方式形成客户请求。 
Socket是网络上运行的两个程序间双向通信连接的一端。Socket这个词的一般意义是自然的或人工的插口,如家用电器的电源插口等。 
客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket把结果返回给客户。 
Socket是一种底层连接。客户机和服务器通过写入到Socket的字节流进行通信。它们必须有共同的协议,也就是说,通过Socket相互传送信息时所用的语言必须是协定好的。 
 
2. Socket建立连接的过程 
建立过程如下:(connection-oriented) 
server 方过程 client 方过程 
 
socket() socket() 
| | 
bind() bind() 
| | 
listen() | 
| | 
accept()<------------------connect() 
| | 
recv()/send() <----------> send()/recv() 
 
3. Php 基本套接字调用: 
3.1. 基本套接字调用 
创建套接字--socket(); 
绑定本机端口--bind(); 
建立连接--connect(),accept(); 
侦听端口--listen(); 
数据传输--send(),recv(); 
输入/输出多路复用--select(); 
关闭套接字--closesocket() 
3.2. php提供的套接字调用: 
接受连接-—accept connect()  
绑定端口—bind () 
关闭套接字—close() 
初始化连接—connect() 
侦听端口—listen() 
读取套接字—read() 
创建套接字—socket() 
写套接字—write() 
 
4. 基本应用 
4.1. 一个简单的TCP服务器 
 
1 #!/usr/local/bin/php -q 
2  
3 <?php 
4 /* 
5 * We don't want any time-limit for how the long can hang 
6 * around, waiting for connections: 
7 */ 
8 set_time_limit(0); 
9  
10 /* Create a new socket: */ 
11 if( ($sock = socket( AF_INET, SOCK_STREAM, 0 )) < 0 ) 
12 { 
13 print strerror( $sock ) . "n"; 
14 exit(1); 
15 } 
16  
17 /* Bind the socket to an address and a port: */ 
18 if( ($ret = bind( $sock, "10.31.172.77", 10000 )) < 0 ) 
19 { 
20 print strerror( $ret ) . "n"; 
21 exit(1); 
22 } 
23  
24 /* 
25 * Listen for incoming connections on $sock. 
26 * The '5' means that we allow 5 queued connections. 
27 */ 
28 if( ($ret = listen( $sock, 5 )) < 0 ) 
29 { 
30 print strerror( $ret ) . "n"; 
31 } 
32  
33 /* Accept incoming connections: */ 
34 if( ($msgsock = accept_connect( $sock )) < 0) 
35 { 
36 print strerror( $msgsock ) . "n"; 
37 exit(1);  
38 } 
39  
40 /* Send the welcome-message: */ 
41 $message = "Welcome to my TCP-server!n"; 
42 if( ($ret = write( $msgsock, $message, strlen($message)) ) < 0 ) 
43 { 
44 print strerror( $msgsock ) . "n"; 
45 exit(1); 
46 } 
47  
48 /* Read/Receive some data from the client: */  
49 $buf = ''; 
50 if( ($ret = read( $msgsock, $buf, 128 )) < 0 ) 
51 { 
52 print strerror( $ret ) . "n"; 
53 exit(1); 
54 } 
55  
56 /* Echo the received data back to the client: */ 
57 if( ($ret = write( $msgsock, "You said: $buf
         |  
 
 |