前言 |
听起局域网下聊天是不是很难,很高大上的样子,怎么样让两台电脑,在同一局域网下实现聊天呢,先说一下思路吧,一会直接上代码。
1. 首先我们先要创建一个服务器,也就是说两台电脑有一台要当着服务器,供客户端链接。
2. 服务器创建好,服务器还要时时刻刻的接受客户端的链接。
3. 客户端连接上之后,服务器还要时时刻刻接受客户端发来的信息。
4. 客户端发送消息,当然要以字节的形式传给服务器,这中间就会有一个转化的过程。
5. 当然服务器和客户端都要有接受发送消息
6. 最后把客户端发来消息追加上去
思路就是这个样子听起来好像还可以哈!
建立服务器 |
//Socket服务器端的逻辑
//1、创建Socket对象
//第一个参数设置网络寻址的协议 第二个参数设置数据传输的方式 第三个参数数据设置通信的协议
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//追加到文本
this.txtLog.Text = "创建服务器端Socket对象\r\n" + this.txtLog.Text;
//2、绑定IP和端口
IPAddress ip = IPAddress.Parse("192.168.20.240");
IPEndPoint ipEndpoint = new IPEndPoint(Administrator.frmAdministratorMain.ip, int.Parse("51000"));
Administrator.frmAdministratorMain.serverSocket.Bind(Administrator.frmAdministratorMain.ipEndpoint);
serverSocket.Bind(ipEndpoint);
3、开启侦听
Administrator.frmAdministratorMain.serverSocket.Listen(10); //等待链接的队列
4、开始接受客户端的链接
this.txtLog.Text = "开始接受客户端链接\r\n" + this.txtLog.Text;
ThreadPool.QueueUserWorkItem(new WaitCallback(this.StatAcceptClient), Administrator.frmAdministratorMain.serverSocket);
public void StatAcceptClient(object state)
{
var serverSocket = (Socket)state;
this.AppendTextToTextlog("服务器端开始接受客户端的链接");
while (true)
{
Socket proxSocket = serverSocket.Accept();
this.txtLog.Text = string.Format("一个客户端:{0}链接上\r\n{1}", proxSocket.RemoteEndPoint.ToString(), txtLog.Text);
clientProxSocketList.Add(proxSocket);
//服务器端接受客户端的消息
ThreadPool.QueueUserWorkItem(new WaitCallback(this.RecieveData), proxSocket);
}
}
private void RecieveData(object obj)
{
var proxSocket = (Socket)obj;
byte[] data = new byte[1024 * 1024];
//方法的返回值代表实际上接受的数据的长度(字节数)
while (true)
{
int realLen = 0;
try
{
realLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
}
catch (Exception ex)
{
this.txtLog.Text = string.Format("客户端:{0}非正常退出", proxSocket.RemoteEndPoint.ToString());
StopConnetct(proxSocket);
}
if (realLen == 0)
{
this.txtLog.Text = string.Format("客户端:{0}正常退出", proxSocket.RemoteEndPoint.ToString());
//对方退出
//proxSocket.Shutdown(SocketShutdown.Both);
//proxSocket.Close();
//clientProxSocketList.Remove(proxSocket);
StopConnetct(proxSocket);
return;
}
string strClientMsg = Encoding.Default.GetString(data, 0, realLen);
AppendTextToTextlog(string.Format("接受到客户端:{0}的消息:{1}\r\n{2}", proxSocket.RemoteEndPoint.ToString(), strClientMsg, txtLog.Text));
}
}
private void StopConnetct(Socket proxSocket)
{
try
{
if (proxSocket.Connected)
{
proxSocket.Shutdown(SocketShutdown.Both);
proxSocket.Close(100);
}
}
catch (Exception ex)
{
}
}
客户端连接 |
//客户端裂解服务器端
//1、创建Socket对象
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientSocket = socket;
//2、连接服务器端
try
{
socket.Connect(IPAddress.Parse("192.168.20.240"), int.Parse("50000"));
}
catch (Exception ex)
{
return;
}
//3、发送消息,接受消息
Thread thread = new Thread(new ParameterizedThreadStart(RecieveData));
thread.IsBackground = true;
thread.Start(ClientSocket);
private void RecieveData(object obj)
{
var proxSocket = (Socket)obj;
byte[] data = new byte[1024 * 1024];
//方法的返回值代表实际上接受的数据的长度(字节数)
while (true)
{
int realLen = 0;
try
{
realLen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
}
catch (Exception ex)
{
this.txtLog.Text = string.Format("服务器端:{0}非正常退出", proxSocket.RemoteEndPoint.ToString());
StopContnet(); //停止连接
}
if (realLen == 0)
{
this.txtLog.Text = string.Format("服务器端:{0}正常退出", proxSocket.RemoteEndPoint.ToString());
StopContnet(); //停止连接
return;
}
}
public string ProcessRecieveString(byte[] data,int reallen)
{
string str = Encoding.Default.GetString(data, 1, reallen-1);
return str;
}
private void StopContnet()
{
try
{
if (ClientSocket.Connected)
{
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close(100);
}
}
catch (Exception ex)
{
}
}
总结 |
刚开始接触不太好搞懂,然后出错也解决不了,这种情况可以去上网百度深入了解Socket怎么实现双向的通信连接数据的交换,小生是通过一遍一遍的走代码,通过看里面的参数变化,弄懂了点皮毛!