非常简单的TCP/IP通信尝试,因为电脑只有一台,就只是试了一下本地通信,有机会试了远程主机通信,再来补充。
t_server=tcpip('0.0.0.0',30000,'NetworkRole','server');%与第一个请求连接的客户机建立连接,端口号为30000,类型为服务器。
fopen(t_server);%打开服务器,直到建立一个TCP连接才返回;
try_times=100;%尝试读取缓冲区数据的次数,可随意设置;
for i=1:try_times
pause(0.02);%每次读取之前等待0.02s,随意设置
try %因为fread()在缓冲区没有数据的时候读取会报错,因此用try—catch语句忽略这种错误,直到读取到数据。
data_recv=fread(t_server,t_server.BytesAvailable);%从缓冲区读取数字数据
%%%%%%%%% data_recv=fscanf(t_server); %接收文本数据
catch
t_server.ValuesReceived%查看读取出的数据数量,如果没有读到,返回0;
end
end
t_client=tcpip('localhost',30000,'NetworkRole','client');%与本地主机建立连接,端口号为30000,作为客户机连接。
fopen(t_client);%与一个服务器建立连接,直到建立完成返回,否则报错。
data_send=sin(1:64);%发送的数字数据。
%%%%%%%% txt_send='HELLO'; %发送的文本数据
pause(1);%等待连接稳定,随意设置。
fwrite(t_client,data_send);%写入数字数据
%%%%%%%% fprintf(t_client,txt_send);%发送文本数据
两段代码分别放入不同的文件, 打开两个matlab界面 , 首先运行服务器 的代码, 然后运行客户机 的代码,就可以顺利完成通信了,如下图所示:
5. fwrite()和fread() 函数可以 传递数值数据 , fprintf()与fscanf() 函数可以 传递文本数据 ,代码中也有说明,很容易转换。
有人反映说是建立TCP连接后,发送浮点数据,会自动转化为正整数,这里就解决一下这个问题。
t_client=tcpip('localhost',30000,'NetworkRole','client');%与本地主机建立连接,端口号为30000,作为客户机连接。
t_client.OutputBuffersize=100000;%设置最大缓冲区
fopen(t_client);%与一个服务器建立连接,直到建立完成返回,否则报错。
data_send=sin(1:64);%发送的数字数据。
%%%%%%%% txt_send='HELLO'; %发送的文本数据
pause(1);%等待连接稳定,随意设置。
fwrite(t_client,data_send,'double');%写入数字数据
%%%%%%%% fprintf(t_client,txt_send);%发送文本数据
服务器
t_server=tcpip('0.0.0.0',30000,'NetworkRole','server');%与第一个请求连接的客户机建立连接,端口号为30000,类型为服务器。
t_server.InputBuffersize=100000;%设置最大缓冲区
fopen(t_server);%打开服务器,直到建立一个TCP连接才返回;
try_times=50;%尝试读取缓冲区数据的次数,可随意设置;
for i=1:try_times
pause(0.02);%每次读取之前等待0.02s,随意设置
try %因为fread()在缓冲区没有数据的时候读取会报错,因此用try—catch语句忽略这种错误,直到读取到数据。
data_recv=fread(t_server,t_server.BytesAvailable,'double');%从缓冲区读取数字数据
if data_recv~=NULL
break;
end
%%%%%%%%% data_recv=fscanf(t_server); %接收文本数据
catch
t_server.ValuesReceived%查看读取出的数据数量,如果没有读到,返回0;
end
end
fclose(t_server);
服务器
t_server=tcpip('0.0.0.0',30000,'NetworkRole','server');%与第一个请求连接的客户机建立连接,端口号为30000,类型为服务器。
t_server.InputBuffersize=100000;
fopen(t_server);%打开服务器,直到建立一个TCP连接才返回;
%get(t_server);
while(1)
if t_server.BytesAvailable>0
t_server.BytesAvailable
break;
end
end
pause(1);
data_recv=fread(t_server,t_server.BytesAvailable/8,'double');%从缓冲区读取数字数据
fclose(t_server);
客户机
t_client=tcpip('localhost',30000,'NetworkRole','client');%与本地主机建立连接,端口号为30000,作为客户机连接。
t_client.OutputBuffersize=100000;
fopen(t_client);%与一个服务器建立连接,直到建立完成返回,否则报错。
data_send=sin(1:64);%发送的数字数据。
%%%%%%%% txt_send='HELLO'; %发送的文本数据
pause(1);%等待连接稳定,随意设置。
fwrite(t_client,data_send,'double');%写入数字数据
pause(1);
%%%%%%%% fprintf(t_client,txt_send);%发送文本数据
fclose(t_client)
注意: 本方法不适用于公网远程通信,具体原因看我这篇文章:
MATLAB实现简单的聊天软件
UDP的公网单向通信请看这篇文章:
Matlab公网通信的实现(NAT123实现内网穿透)