问题:
1、socket通信机制是什么?
官方给出的解释是:
在网络编程中最常用的方案便是Client/Server(客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一 直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。
为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。
1、创建socket通信机制的前提是:
知道服务器的ip 和端口号
知道客户端的ip和端口号
知道通信协议
2、socket工作原理:
3、代码实现阶段:
主要思路:
1、建立套接字
2、绑定本机ip和端口号
3、tcp协议,监听是否有收到发送请求
4、关闭连接
//服务器端代码
int recv; //接收客户端发送数据的长度
byte[] data=new byte[1024]; //y用于缓存客户发送的数据信息, 客户端发送信息必须以数组形式发送
//预留出本机的ip和端口号,创建监听点
IPEndPoint ipep=new IPEndPoint(IPAddress.Any(ip地址),8080(port端口号));
//新建套接字,c创建通道
socket mysocket=new socket(AddressFamily.internetwork,sockettype.stream,potocoltype.tcp;)
//绑定套接字,绑定客户端的ip和端口号
mysocket.bind(ipep);
//监听
mysocket.listen(10);
当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信
socket nextsocket=mysocket.Accept();
//将下一个连接的客户端ip地址强制转换为ipendpoint类型
IPEndPoint clientip=(IPEndPoint)nextclient.RemoteEndPoint;
string send_txt="hello world";
//将收到的数据解析
data=Encoding.AscII.GetBytes(send_txt);
//发送数据
nextclient.send(data.data.length,socketFlags.none);
//从客户端获取数据
while(true)
{
data=new byte[1024];
recv=nextclient.receive(data);
console.writeline("recv="+recv);
if(recv==0)
{
//接收的数据长度为0,表示连接断开
break;
}
//将收到的数据信息解析后输出到控制台
console.writeline(Encoding.ASCLL.GstString(data,0,recv));
nextclient.send(data,recv,socketflags.none);
}
nextclient.close();
mysocket.close();
}
}
//客户端代码
//预留接收数据缓存数组
byte[] data=new byte[1024];
//创建套接字,创建通道
socket newclient=new socket(AddressFamily.Interwork,SocketType.stream,ProtocolType.none);
console.writeline("请输入服务器ip地址");
//创建监听点,ip,端口号
string ipaddress=console.readline();
console.writeline("请输入服务器端口号");
int port=convet.ToInt32(console.readline());
IPEndPoint ipep=new IPEndPoint(AddressFamily.InterNetWork,SocketType.stream,ProtocolType.none);
//连接
try
{
//因为客户端指向特定的服务器发送请求,所以不需要绑定本机的ip和端口号,
且不需要监听
//连接
newclient.connect(ipep);
}
catch(Exception ex)
{
alert("连接失败,失败原因:"+ex.tostring());
return;
}
int recv=newclient.receive(data);
string stringdata=Encoding.ASCII.GetString(data0,recv); ??
cosole.writeline(stringdata);
//循环给服务器发送请求
while(true)
{
string input=console.readline();
if(input=="exit")
break;
newclient.send(Encoding.ASCLL.GetBytes(input));
data=new byte[1024];
recv=newclient.receive(data);
stringdata=Encoding.ASCLL.GetString(data,0,recv);
console.writeline(stringdata);
}
newclient.ShutDown(socketShutdown.both);
newclient.close();
如有问题,请多多指教!!