socket(php)(短连接)(无循环,能接发一次,自动关闭)整理版本1

本文介绍了一个使用 PHP 创建的简单 Socket 服务器示例。该服务器能够监听指定 IP 和端口上的连接请求,并能接收客户端的数据,对其进行处理后返回处理结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
	$host="192.168.1.57";			//Socket运行的服务器的IP地址
	$port=8079;				//Socket运行的服务器的端口,端口取值为1到65535之间的数字,前提是这个端口未被使用	
	set_time_limit(0);			// 设置超时时间,这里设置为永不超时,确保PHP在等待客户端连接时不会超时。
	
	//echo 1;	//能输出1
	$socket = socket_create(AF_INET,SOCK_STREAM,0) or die("Could not create socket\n");		// 创建一个Socket,返回一个Socket句柄,参数:哪个协议,套接字使用的类型,参数一下的具体协议(可以使用 getprotobyname() 函数进行读取)
	$result = socket_bind($socket,$host,$port) ;		//绑定Socket到指定的地址和端口
	$result = socket_listen($socket,3) ;			// 开始监听外部连接,第二个参数基本床3,4,5,也可以不传
	/******到这里,服务器除了等待来自客户端的连接请求外基本上什么也不做******/
			
	$spawn = socket_accept($socket) ;			// 接收连接,另一个Socket来处理服务端与客户端的通信
	if(socket_getpeername($spawn , $host , $port))
	{
	    echo "Client $host : $port is now connected to us.";
	}
	if($spawn){
		echo '<br /n>'; 
		$date = date("Y-m-d H:i:s D a");
	    echo $date;
	    echo '<br /n>'; 
	}
	
	//读取客户端的输入
	$input=socket_read($spawn,1024) ;			// 读取客户端的输入,当一个连接被建立后,服务器就会等待客户端发送一些输入信息,这些信息可以由socket_read()函数来获得,并把它赋值给PHP的$input变量,socker_read的第二个参数用以指定读入的字节数,你可以通过它来限制从客户端获取数据的大小   
	socket_last_error();
	//对接收到的信息进行处理,然后返回到客户端
	$input=trim($input);					//返回字符串 $input,去除首尾空白字符后的结果。如果不指定第二个参数
	//处理客户端输入并返回结果,当客户端发来数据信息后,信息输出就要靠socket_write()函数来完成
	echo "laizikehuduande:" . $input;
	echo '<br /n>'; 
		
	$output="fangeikehuduande:\n" . strrev($input);		//反转字符串,这里仅仅是为了更好的区分两条信息	 
	echo $output;	
	socket_write($spawn,$output,strlen($output));
	socket_last_error();
	echo '<br /n>';
	// 关闭sockets
	socket_close($spawn);
	socket_close($socket);
	printf("Closed the socket");
?>	

在Android中,创建一个Socket连接并处理接发指令消息通常涉及到网络通信和多线程技术。以下是一个简单的示例,说明如何利用`AsyncTask`和队列来管理Socket操作: 1. **初始化Socket连接**: 首先,你需要创建一个`Socket`实例,并连接到服务器。你可以使用`InetAddress`和`ServerSocket`或者直接IP地址和端口号。 ```java Socket socket = new Socket(host, port); ``` 2. **创建消息队列**: 使用`LinkedBlockingQueue`或者`ArrayDeque`作为消息队列,它们可以保证元素的顺序并且支持并发访问。 ```java import java.util.concurrent.LinkedBlockingQueue; BlockingQueue<String> messageQueue = new LinkedBlockingQueue<>(); ``` 3. **发送消息**: 创建一个`SendMessageTask`,负责将消息放入队列。你可以定期检查队列是否为空,然后使用Socket发送消息。 ```java class SendMessageTask extends AsyncTask<Void, Void, Boolean> { @Override protected Boolean doInBackground(Void... voids) { String command = ...; // 获取待发送的消息 try { sendMessage(socket, command); return true; } catch (Exception e) { e.printStackTrace(); return false; } } private void sendMessage(Socket socket, String command) throws Exception { // 实现发送命令的具体逻辑 } } ``` 4. **接收消息**: 类似地,创建一个`ReceiveMessageTask`用于从Socket接收消息,并将新消息添加到队列。 ```java class ReceiveMessageTask extends AsyncTask<Void, String, Void> { @Override protected Void doInBackground(Void... voids) { try { while (!isCancelled()) { if (socket.isConnected()) { String receivedMessage = receiveMessage(socket); messageQueue.put(receivedMessage); } else { break; } } } catch (Exception e) { e.printStackTrace(); } return null; } private String receiveMessage(Socket socket) throws Exception { // 实现接收消息的具体逻辑 } } ``` 5. **异步执行任务**: 将`SendMessageTask`和`ReceiveMessageTask`放在后台执行,例如在`AsyncTask`的`onPreExecute()`和` onPostExecute()`方法中启动它们。 6. **监控和同步**: 当需要读取消息时,从队列中取出数据,并确保在执行时处理消息不会出错。 **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值