服务端与客户端通过socket(套接字)进行数据交互。
socket是进程通讯机制,相当于一个接口,两个程序的通讯通过socket进行连接。
socket类里包含多个协议,本次选择TCP。
1.服务端
//建立TCP连接
private void CreateTCP()
{
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
//InterNetwork为Internet版本IPv4协议,ProtocolType类型选择TCP
socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress, true);
// 允许将套接字绑定到已在使用中的地址。
try
{
socket.Bind(new IPEndPoint(IPAddress.Any, 8888));
//绑定IP地址和端口,IP地址选择any(本机所有Ip),或者制定地址例如 IPAddress.prase("192.168.0.0")。
socket.Listen(1000);
//监听设定的端口,参数为最大侦听数量;
socket.BeginAccept(new AsyncCallback(TcpConnectCallback), socket);
//异步接收连接,连接后调用TcpConnectCallback方法
}
catch(Exception e)
{
MessageBox.Show(e.Message);
return;
}
}
//接收连接后执行回调
private void TcpConnectCallback(IAsyncResult ar)
{
Socket server = (Socket)ar.AsyncState;
Socket client = server.EndAccept(ar);
/*
创建client用来处理远程主机的通讯,并对此进行处理。
此处加入所需的方法
例如:
Thread t = new Thread(RcvMsg);//自定义RcvMsg方法
t.IsBackground=true;
t.Start(Client);
C#禁止跨线程调用控件,因此如果要操作界面控件,需要采用委托
*/
server.BeginAccept(new AsyncCallback(TcpConnectCallback), server);
}
//一个例子如下
public void RcvMsg(object obj)
{
Socket client = obj as Socket;
while (true)
{
byte[] data = new byte[1024];
int recnum = client.Receive(data);
string sdata = Encoding.UTF8.GetString(data, 0, recnum );
textBox1.Invoke(new Action(() =>
{
textBox1.AppendText(sdata);
}));
}
}
2.客户端
类似,在建立完socket之后,连接服务端,发送信息:
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 8888));//连接对应端口
client.Send("giao");