服务端与客户端之间的通信:
服务端:
1. 启动监听
a. 创建监听套接字
sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//使用ipv4寻址,使用流式套接字,使用Tcp协议
b. 获取网络节点
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
EndPoint endPoint = new IPEndPoint(IPAddress, port);
c. 监听套接字绑定到网络节点上
sokWatch.Bind(endPoint);
d. 启动监听服务
sokWatch.Listen();
e. 创建并开启监听线程
threadWatch = new Thread(StartWatch);
threadWatch.Start();
2. 负责监听客户端连接请求 (void StartWatch())
while (isWatch)
{
//监听到客户端连接请求,会返回一个负责与该客户端通信的新的套接字对象。否则在此阻断线程。
sokConnection = sokWatch.Accept();
//获得通信套接字的远程 ip:port
string strRemoteEndPoint =sokConnection.RemoteEndPoint.ToString();
//将客户端的ip:port 加入到listBox控件中
lbClients.Items.Add(strRemoteEndPoint);
//创建 通信管理类对象
SocketConnection connection = new SocketConnection(sokConnection, ShowMsg);
//将通信管理类对象 添加到集合中
dictConnection.Add(strRemoteEndPoint, connection);
//立即向 客户端套接字发送一个消息数据
sokConnection.Send(System.Text.Encoding.Default.GetBytes("Hello~~!"));
}
3. 向指定客户端发送消息
tring key = lbClients.Text; //得到listbox中选定的项(客户端Ip端口)
if (!string.IsNullOrEmpty(key))
{
//获得要发送的内容
string strMsg = txtSend.Text.Trim();
//通过集合中的键,找到对应通信套接字,来发送数据给对应的客户端
dictConnection[key].SendMsg(strMsg);
}
else
{
MessageBox.Show("请选择要发送的客户端.........");
}
4. 群发消息
//获得要发送的内容
string strMsg = txtSend.Text.Trim();
//循环泛型集合中的值
foreach (SocketConnection value in dictConnection.Values)
{
value.SendMsg(strMsg);
}
5. 向指定客户端发送文件
a. 选择文件(打开对话框)
b. 读取文件数据
c. 发送数据
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
//准备一个文件缓冲区
byte[] arrFile = new byte[1024 * 1024 * 2];
//读取文件数据,获得真实文件长度
int length = fs.Read(arrFile, 0, arrFile.Length);
//创建一个比读取的文件长度多1位的新数组
byte[] arrFileNew = new byte[length + 1];
arrFileNew[0] = 1;//设置标识位为1,代表发送的是文件数据
//将老数组的数据追加到新数组里
Buffer.BlockCopy(arrFile, 0, arrFileNew, 1, length);
sokConnection.Send(arrFileNew);
dgShowMsg("发送文件成功!”);
}
6. 向指定客户端发送闪屏消息
public void SendShack()
{
//准备一个缓冲区
byte[] arrFile = new byte[1];
arrFile[0] = 3;
sokConnection.Send(arrFile);
dgShowMsg("向" + sokConnection.RemoteEndPoint.ToString() + "发送闪屏成功!”);
}
客户端:
1. 向服务端 发送连接请求
2. 循环接收服务端发来的数据
3. 显示消息到文本框
4. 向服务器发送消息
5. 闪屏
向服务端 发送连接请求:
sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //实例化套接字
IPAddress addreass = IPAddress.Parse(txtIP.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(addreass, int.Parse(txtPort.Text.Trim()));
//向指定的 ip端口发送连接请求
sokClient.Connect(endpoint);
循环接收服务端发来的数据
while (isRecMsg)
{
byte[] msgRec = new byte[1024 * 1024 * 2];
int recLength = sokClient.Receive(msgRec);
switch(msgRec[0])
{
case 1://接收到文件
SaveFileDialog sfd = new SaveFileDialog();
if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))
{
fs.Write(msgRec, 1, recLength - 1);
}
ShowMsg("文件保存完毕" + sfd.FileName);
}
break;
case 2://接收到字符串信息
{
//转换为字符串
string strRec = System.Text.Encoding.Default.GetString(msgRec, 1, recLength-1);
//将接收到的数据显示在文本框中
ShowMsg(strRec);
break;
}
case 3://接收到闪屏命令
{
ShakeWindow();
break;
}
}
}
显示消息到文本框:
void ShowMsg(string msg)
{
txtMsg.AppendText(msg + "\r\n");
}
闪屏:
private void ShakeWindow()
{
Random ran = new Random();
//保存窗体原坐标
System.Drawing.Point point = this.Location;
for (int i = 0; i < 30; i++)
{
//随机坐标
this.Location = new System.Drawing.Point(point.X + ran.Next(8), point.Y + ran.Next(8));
System.Threading.Thread.Sleep(15);//暂停15毫秒
this.Location = point;//还原原坐标
System.Threading.Thread.Sleep(15);//暂停15毫秒
}
}
---------------------- Windows Phone 7手机开发、 .Net培训、期待与您交流! ----------------------