接受数据
<?php
header("Content-Type:text/html;charset=utf-8");
//确保在连接客户端时不会超时
set_time_limit(0);
//设置IP和端口号
$address = "wss://tts-api.xfyun.cn/v2/tts?authorization=YXBpX2tleT0iNDE4ZjJjOTI2NTY0YTc1ZDNjMmE5NDliMTE0MzRkZTYiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iUEcvdXVNeFlqa1ZKTzdhS2xCcENGeFozQS8yc3hKRXpENWEwQkZiUlc1dz0i&date=Fri%2C+05+May+2023+10%3A43%3A39+GMT&host=tts-api.xfyun.cn";
$port = 8080; //调试的时候,可以多换端口来测试程序!
/**
* 创建一个SOCKET
* AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6
* SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM
*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//阻塞模式
socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//绑定到socket端口
$result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//开始监听
$result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
echo "OK\nBinding the socket on $address:$port ... ";
echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";
do { // never stop the daemon
//它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
$msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");
//读取客户端数据
echo "Read client data \n";
//socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
$buf = socket_read($msgsock, 8192);
echo "Received msg: $buf \n";
//数据传送 向客户端写入返回结果
$msg = "welcome \n";
socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");
//一旦输出被返回到客户端,父/子socket都应通过socket_close($msgsock)函数来终止
socket_close($msgsock);
} while (true);
socket_close($sock);
?>
发送数据
<?php
// header("Content-Type:text/html;charset=utf-8");
// 创建一个socket对象
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 连接到星火模型的API地址和端口
$api_address = 'wss://spark-api.xf-yun.com/v1.1/chat'; // 请替换为实际的API地址
$api_port = 8080; // 请替换为实际的API端口
$result = socket_connect($socket, $api_address, $api_port);
if ($result === false) {
echo "连接失败: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
} else {
echo "连接成功" . PHP_EOL;
}
// 发送请求数据
$request_data = '{"action": "query", "format": "json", "meta": {"siteinfo": {"generator": "PHP"}}}'; // 请根据实际情况修改请求数据
$send_result = socket_write($socket, $request_data, strlen($request_data));
if ($send_result === false) {
echo "发送请求失败: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
} else {
echo "发送请求成功" . PHP_EOL;
}
// 接收响应数据
$response_data = '';
while (true) {
$read_result = socket_read($socket, 1024);
if ($read_result === false || $read_result == '') break; // 如果读取到的数据为空或者读取失败,则跳出循环
$response_data .= $read_result;
}
echo "接收到的响应数据: " . $response_data . PHP_EOL;
// 关闭socket连接
socket_close($socket);
?>
注意:
1、发送数据的php需要用cmd方便调试,因为cmd可以直接运行php,并且能把每次发过来的东西都打印出来。php E:\zhongjiao\WWW\xt_xinghuo\ceshi2.php
2、如果报这个错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。需要修改一下端口号