以PHP作为服务端进行TCP服务通讯

关键词 TCP/IP、PHP Socket扩展.
相关资料
知乎-PHP 下的 Socket 编程
php中连接tcp服务的三种方式
为什么socket叫套接字
PHP+Socket系列之实现客户端与服务端数据传输

相关函数
socket_create 创建套接字
socket_set_block 设置套接字为阻塞模式
socket_bind 给套接字绑定名字
socket_listen 监听套接字的连接
socket_accept 接受套接字上的连接
socket_read 从套接字中读取最大长度的数据
socket_write 向套接字写数据
socket_close 关闭 Socket 实例

因为项目需求,需要将硬件传递过来的信息整理并记录。而硬件是通过TCP/IP协议进行信息传输,所以需要以PHP作为服务端,接收信息。

服务端代码

<?php
set_time_limit(0);

if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE){
	echo '初始化socket失败: ' . socket_strerror(socket_last_error($socket));
	exit;
}
 
socket_set_nonblock($socket);
 
// socket_bind(): 将socket资源绑定到指定地址
if(!socket_bind($socket, '127.0.0.1', 7228)){
	echo '绑定端口失败: ' . socket_strerror(socket_last_error($socket));
	exit;
}
 
// socket_listen(): 监听socket的连接请求
if(!socket_listen($socket)){
	echo '监听端口: ' . socket_strerror(socket_last_error($socket));
	exit;
}

while(1){
	if(($client = socket_accept($socket)) !== FALSE){
		while(1){
			//这里不循环的话,只能接收到一次消息
			$content = socket_read($client, 10240);
			$content = trim($content);
			
			if($content == 'shutdown'){
				socket_close($client);
				break 2;
			}
			
			if($content){
				echo $content . PHP_EOL;
				$response = '接收信息成功!';
				//如果不给返回,客户端无法再发送消息
				socket_write($client, $response);
			}
		}
	}
}                 
socket_close($socket);

客户端代码

<?php

// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 连接服务端
socket_connect($socket, '127.0.0.1', 7228);

while (true) {
    // 让控制台输入内容
    fwrite(STDOUT, '请输入内容:');
    $in = fgets(STDIN);

    // 向服务端发送内容
    socket_write($socket, $in);

    // 读取服务端发送的消息
    $msg = socket_read($socket, 10240);
    echo $msg;
}

从代码上看还挺简单的,但是背后还有更复杂的工作原理需要去了解学习。
不了解原理拿来套用哪里出问题都不明白原因,太痛苦了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您想了解关于Java多线程TCP通讯在物联网服务的应用吗? 首先,TCP通讯是指通过TCP协议进行的网络通讯。在物联网服务,我们可以使用Java中的Socket类和ServerSocket类来实现TCP通讯。具体实现中,我们可以使用多线程来提高服务的并发处理能力。 以下是一个简单的示例代码,实现了一个基于多线程的物联网Java服务TCP通讯: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class IoTServer { public static void main(String[] args) throws IOException { int port = 8888; ServerSocket serverSocket = new ServerSocket(port); System.out.println("服务器已启动,等待客户连接..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("客户已连接,IP地址为:" + socket.getInetAddress().getHostAddress()); new Thread(new IoTServerHandler(socket)).start(); } } static class IoTServerHandler implements Runnable { private Socket socket; public IoTServerHandler(Socket socket) { this.socket = socket; } @Override public void run() { try { // 获取输入流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 获取输出流 PrintWriter out = new PrintWriter(socket.getOutputStream()); String line; while ((line = in.readLine()) != null) { System.out.println("客户:" + line); out.println("服务已收到消息:" + line); out.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 以上代码中,我们使用ServerSocket监听指定口,并在接收到客户连接后开启一个新线程处理该连接。在IoTServerHandler中,我们通过输入流读取客户发送的消息,并通过输出流向客户发送响应。 当然,这只是一个简单的示例,实际应用中我们需要根据具体需求进行更加细致的设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值