面像连接地例子 使用同步套接字,一个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);
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()
...{
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();
//释放资源
}
}
[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();
//释放资源
}
}