MATLAB实现TCP/IP的简单通信

非常简单的TCP/IP通信尝试,因为电脑只有一台,就只是试了一下本地通信,有机会试了远程主机通信,再来补充。

(注意:可以直接看最下面最后一次更改,上面相当于是试错,最后的简单又效率高)

1. 首先,建立服务器,代码如下:

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

2. 其次,建立客户机,代码如下:

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);%发送文本数据

3. 运行程序

两段代码分别放入不同的文件, 打开两个matlab界面首先运行服务器 的代码, 然后运行客户机 的代码,就可以顺利完成通信了,如下图所示:MATLAB实现TCP/IP的简单通信_第1张图片
5. fwrite()和fread() 函数可以 传递数值数据fprintf()与fscanf() 函数可以 传递文本数据 ,代码中也有说明,很容易转换。


补充:

有人反映说是建立TCP连接后,发送浮点数据,会自动转化为正整数,这里就解决一下这个问题。

  1. 首先,解释一下为什么会转化为正整数:fwrite()和fread()函数其实还有第三个参数,是为了指定发送和接收的数据类型,而默认第三个参数的类型为 ‘uchar’ ,因此所有的浮点数会进行强制类型转换,之后再进行传输。
  2. 因此解决这个问题,就需要为函数添加第三个参数,很简单,在最后面添加‘两个参数的最后面添加 ‘double’ 即可
  3. 其实对于上面的代码来讲,只添加 ’double‘ 还不足以运行成功,还有一个问题,就是TCP的缓冲区问题,matlab中默认的TCP缓冲区大小为512个bit,而我们的数据量为 648=4096 (double类型每个占据8字节),恰好超出传输范围,因此不能写入缓冲区,那么就需要扩大缓冲区范围。
  4. 扩大缓冲区范围也很简单,只需要在服务器端和客户端各添加一行代码,类似 t_client.OutputBuffersize=100000; (大于你传输的字节数即可),就可以完成浮点数的数据传输了
  5. 代码还是贴在下面,可以跑一下试试:
    客户机
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);
  1. 这里有matlab官方给出的解决方案,大家有兴趣可以看一下,讲的更加深入一点

实践证明,以上均为笨比方法,下面代码更简单,也不容易报错,分享:

服务器

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实现内网穿透)

你可能感兴趣的:(MATLAB代码)