How to implement Socket server with PHP

WBOY
Release: 2016-08-08 09:22:07
Original
1220 people have browsed it

This article was originally translated by MaNong.com - Wang Guofeng. Please read the reprint requirements at the end of the article for reprinting. Welcome to join the technical translation team!

Want to build a chat app, or even a game? Then, the socket server will be your first step. Once you understand the basic functionality of creating a server, subsequent optimization steps become equally simple.

The socket server works like this, running continuously to wait for client connections. Once the client is connected, the server adds it to the client list and starts waiting for messages from the client.

Don’t go away, here’s the full source code:

// Set time limit to indefinite execution
set_time_limit (0);

// Set the ip and port we will listen on
$address = 'localhost';
$port = 10000;
$max_clients = 10;

// Array that will hold client information
$client = Array();

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');
// Start listening for connections
socket_listen($sock);

echo "Waiting for connections...\r\n";

// Loop continuously
while (true) {
	// Setup clients listen socket for reading
	$read[0] = $sock;
	for ($i = 0; $i < $max_clients; $i++) {
		if (isset($client[$i]['sock']))
			$read[$i + 1] = $client[$i]['sock'];
	}
	// Set up a blocking call to socket_select()
	if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1)
		continue;
	/* if a new connection is being made add it to the client array */
	if (in_array($sock, $read)) {
		for ($i = 0; $i < $max_clients; $i++) {
			if (empty($client[$i]['sock'])) {
				$client[$i]['sock'] = socket_accept($sock);
				echo "New client connected $i\r\n";
				break;
			}
			elseif ($i == $max_clients - 1)
				echo "Too many clients...\r\n";
		}
	} // end if in_array

	// If a client is trying to write - handle it now
	for ($i = 0; $i < $max_clients; $i++) { // for each client
		if (isset($client[$i]['sock'])) {
			if (in_array($client[$i]['sock'], $read)) {
				$input = socket_read($client[$i]['sock'], 1024);
				if ($input == null) {
					echo "Client disconnecting $i\r\n";
					// Zero length string meaning disconnected
					unset($client[$i]);
				} else {
					echo "New input received $i\r\n";
					// send it to the other clients
					for ($j = 0; $j < $max_clients; $j++) {
						if (isset($client[$j]['sock']) && $j != $i) {
							echo "Writing '$input' to client $j\r\n";
							socket_write($client[$j]['sock'], $input, strlen($input));
						}
					}
					if ($input == 'exit') {
						// requested disconnect
						socket_close($client[$i]['sock']);
					}
				}
			} else {
				echo "Client disconnected $i\r\n";
				// Close the socket
				socket_close($client[$i]['sock']);
				unset($client[$i]);
			}
		}
	}
} // end while
// Close the master sockets
socket_close($sock);
Copy after login

Gee, this may seem like a big project at first, but we can break it down into smaller parts first. The first part is creating the server. Lines: 2 to 20.

This part of the code sets the variables, address, port, maximum client and client array. Next create the socket and bind it to the address and port we specified.

What we have to do next is to execute an infinite loop (actually we did it on purpose!). Lines: 22 to 32. The first step we do in this part of the code is to set up the $read array. This array contains all clients' sockets and our main server's sockets. This variable will be used later in the select statement: telling PHP to listen for every message from these clients.

The last parameter of socket_select() tells our server to wait up to 5 seconds before returning a value. If its return value is less than 1, it means that no data has been received, so you just need to return to the top of the loop and continue waiting.

The next part of the script is to add a new client to the array. Lines: 33 to 44.

Place new clients at the end of the list. Check to make sure we don't have more clients than we want the server to handle.

The code block to be introduced below is quite large and is the main part of the server. When the client sends a message to the server, this piece of code needs to come forward to process it. The message can be anything from a disconnect message to an actual disconnect - whatever the server needs to process. Lines: 46 to the end.

The code loops through each client and checks if a message has been received from them. If so, get the input content. Check based on the input whether this is a disconnect message, if so then delete them from the array, otherwise, then it is a normal message, then our server goes through all the clients again and writes the message to them one by one, Skip sender.

Okay, let’s try creating your own chat server!

The above introduces how to use PHP to implement a Socket server, including the relevant aspects. I hope it will be helpful to friends who are interested in PHP tutorials.

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!