做个例子证实一下:tcp协议

面像连接地例子 使用同步套接字,一个server对应于一个client

同步套接字的解释:
    在通过Socket进行连接、接收、发送操作时,客户机或服务器会暂停当前工作,处于等待状态,即一直等到有数据时才继续执行下面的语句。一般在阻塞方式下使用这种方式。可见,同步套接字适用于网络传输量不太大的情况。当网络传输量很大时,长时间的等待可能会让用户无法忍受。

在这个例子中,使用byte数组做为数据发送或者接收的缓冲区,当服务器通过TCP协议收到的数据后,数据存在系统内的TCP缓冲区内,当调用Receive()方法时,这个方法尝试从TCP的缓冲区中去除一定数量的数据,数量受以下两个因素的影响
第一:程序中指定的byte数组的长度
第二:Receive()方法中指定的size参数

第一种情况, 不指定size参数

 

m_clientSocket.Send(Encoding.UTF8.GetBytes(t_input));
data
= new   byte [ 1024 ];
m_recv
= m_clientSocket.Receive(data);
System.Console.WriteLine(m_recv.ToString());
// 如果TCP缓冲区中的数据少于1024那么,返回的数值,就是TCP缓冲区的所有内容的byte数
string  t_serversend = Encoding.UTF8.GetString(data, 0 ,data.Length);
Console.WriteLine(t_serversend);

 

使用这种方法接收数据,并没有指定size的大小,size 默认的情况下,为数据的长度,如果TCP的缓冲区的数据量少于1024,那么,他就会把TCP缓冲区的数据全部取出,并返回实际读取的字节数给m_recv

如下所示


Welcome to my test server
test
testome to my test server
a bad test
a bad test my test server
exit

 

客户端代码

 

public   class  cxyTcpClien
{
    [STAThread]
    
public static void Main()
    
{
        IPEndPoint m_endpoint
=new IPEndPoint(IPAddress.Parse("127.0.0.1"),1234);
        Socket m_clientSocket
=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
        
try
        
{
            m_clientSocket.Connect(m_endpoint);
        }

        
catch(Exception ex)
        
{
            Console.WriteLine(
"不能连接到主机");
            
return ;
        }


        
byte[] data=new byte[1024];
        
int m_recv=m_clientSocket.Receive(data);
        
string m_getdata=Encoding.UTF8.GetString(data,0,m_recv);
        Console.WriteLine(m_getdata);

        
while(true)
        
{
            
string t_input=Console.ReadLine();
            
if(t_input=="exit")
                
break;
            m_clientSocket.Send(Encoding.UTF8.GetBytes(t_input));
            data
=new byte[1024];
            m_recv
=m_clientSocket.Receive(data);
            System.Console.WriteLine(m_recv.ToString());
//如果TCP缓冲区中的数据少于1024那么,返回的数值,就是TCP缓冲区的所有内容的byte数
            string t_serversend=Encoding.UTF8.GetString(data,0,m_recv);
            Console.WriteLine(t_serversend);

        }


        Console.WriteLine(
"准备从服务器断开");
        m_clientSocket.Shutdown(SocketShutdown.Both);
        m_clientSocket.Close();

        
    }

}

服务器端代码

 

{
    [STAThread]
    
public static void Main()
    
{
        IPAddress m_ip
=IPAddress.Parse("127.0.0.1");
        IPEndPoint m_ipend
=new IPEndPoint(m_ip,1234);
        Socket m_server
=new Socket(AddressFamily.InterNetwork,
            SocketType.Stream,ProtocolType.Tcp);
        m_server.Bind(m_ipend);
        m_server.Listen(
10);
        Console.WriteLine(
"正在等待客户端的连接");
        Socket m_client
=m_server.Accept();

        
string m_welcome="欢迎来到我的服务器";

        
byte[] data=new byte[1024];
        data
=Encoding.UTF8.GetBytes(m_welcome);
        m_client.Send(data,
0,data.Length,SocketFlags.None);

        IPEndPoint m_newclient
=m_client.RemoteEndPoint as IPEndPoint;
        
if(m_newclient!=null)
            Console.WriteLine(
"连接的客户端IP是{0},端口是{1}",m_newclient.Address,m_newclient.Port);
        
        
int recv;
        
for(int i=0;i<5;i++)
        
{
            recv
=m_client.Receive(data);
            Console.WriteLine(Encoding.UTF8.GetString(data,
0,recv));
            m_client.Send(data);
        }


        Console.WriteLine(
"从服务器断开{0}",m_newclient.Address);
        m_client.Close();
        m_server.Close();
        
//释放资源
        
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值