很明显,对于socket编程来说,需要涉及到,c/s模式。即需要一个服务器程序和一个客户端程序之间的通讯。在c#里面需要引用system.net 来引用socket类。引用system.net.sockets 来使用网络流
那么怎么来进行通讯呢?如果你使用的socket是以网络流的形式通讯的话,我们首先要实现一个握手的过程。相互能感知和锁定对方。这样才能进行数据交互。握手代码如下:
sever:
//服务器侦听端口可预先指定(此处使用了最大端口值)
//Any表示服务器应侦听所有网络接口上的客户活动
private IPEndPoint IPP = new IPEndPoint(IPAddress.Any, 65535);//IPAddress.any可以换成本机ip地址
private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//构建socket的基本信息
socket.Bind(IPP);//关联(绑定)节点
socket.Listen(0);//0表示连接数量不限
private Socket Clinet=socket.Accept();//实现握手的语句
Clinet:
try
{
//textbox1.txt里面为,对方(服务器)ip地址,textbox2.text里面是一个端口号,这个与服务器上的端口号要保持一致
IPP = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text));
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(IPP);//实现握手的过程
}
catch
{
MessageBox.Show("无法与服务器通信");
}
单词socket的意思是插座的意思,我是这样去理解的,要想实现,两者通讯,我们需要在服务器的这一头,建立一个插座,soket_sever。当然这个socket里面需要包含本地服务器的相关信息(ip,port),否则就是一个没有用的插座。在客户机的这一边,我们需要构造另一个插座,socket_clinet。里面要包含对方的(ip,port)。由于socket_sever绑定了本地信息,一直处于监听状态,只要客户机上的socket_clinet能发出邀请,就实现了一次握手。 这样我们可以理解为,在这两个插座上我们连接了一条线(网络流)。这样我们就可以再上面进行数据的读写了。从而实现数据的交互。
至于如何在流上进行写数据,和读数据。就要用到另一个命名空间了
using system.Net.sockets;
NetworkStream nstream=new NetworkStream(clientSocket);//让这天线(流)连在客户的那个插头上
//实现以四个字节进行读取
byte[] datasize=new byte[4];
nstream.Read(datasize,0,4);
int size=BitConverter.ToInt32(datasize,0);
Byte[] message=new byte[size];
int dataleft=size;
while(dataleft>0){
int recv=nstream.Read(meassage,start,dataleft);
start+=recv;
dataleft-=recv;
}
//以四个字节进行写入
byte[] datasize=new byte[4];
datasize=BitConverter.GetBytes(i);//i是对方传过来的数据长度。
byte [] sendbytes=Encoding.Unicode.GetBytes(str);//str是待发送的字符串
NetworkStream nstream=new NetworkStream(clientSocket);
nstream.Write(datasize,0,4);//就是为了留出这么大的空间
nstream.Write(sendbytes,0,sendbytes.Length);//为了让上面留出的空间里,恰好写入这么内容.
nstream.Flush();
这就是我对近期初步接触,socket套接字,以及TCP/IP编程概念的理解。前期就是构造插座,实现握手,后期就是对网络流的读写操作了