代码
public Form1()
}
/// <summary>
/// 监听客户端请求的⽅法;
/// </summary>
void WatchConnecting()
{
while(true)// 持续不断的监听客户端的连接请求;
{
// 开始监听客户端连接请求,Accept⽅法会阻断当前的线程;
Socket sokConnection = socketWatch.Accept();// ⼀旦监听到⼀个客户端的请求,就返回⼀个与该客户端通信的套接字;
// 想列表控件中添加客户端的IP信息;
lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());
// 将与客户端连接的套接字对象添加到集合中;
dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
ShowMsg("客户端连接成功!");
FS();
Thread thr =new Thread(RecMsg);
thr.IsBackground =true;
thr.Start(sokConnection);
dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr);//  将新建的线程添加到线程的集合中去。
}
}
void RecMsg(object sokConnectionparn)
{
string Fn ="";
Socket sokClient = sokConnectionparn as Socket;
while(true)
{
// 定义⼀个2M的缓存区;
byte[] arrMsgRec =new byte[1024*1024*100];
// 将接受到的数据存⼊到输⼊  arrMsgRec中;
int length =-1;
try
{
length = sokClient.Receive(arrMsgRec);// 接收数据,并返回数据的长度;
}
catch(SocketException se)
{
ShowMsg("异常:"+ se.Message);
// 从通信套接字集合中删除被中断连接的通信套接字;
dict.Remove(sokClient.RemoteEndPoint.ToString());
/
/ 从通信线程集合中删除被中断连接的通信线程对象;
dictThread.Remove(sokClient.RemoteEndPoint.ToString());
// 从列表中移除被中断的连接IP
lbOnline.Items.Remove(sokClient.RemoteEndPoint.ToString());
break;
}
catch(Exception e)
{
ShowMsg("异常:"+ e.Message);
// 从通信套接字集合中删除被中断连接的通信套接字;
dict.Remove(sokClient.RemoteEndPoint.ToString());
/
/ 从通信线程集合中删除被中断连接的通信线程对象;
dictThread.Remove(sokClient.RemoteEndPoint.ToString());
// 从列表中移除被中断的连接IP
lbOnline.Items.Remove(sokClient.RemoteEndPoint.ToString());
break;
}
if(arrMsgRec[0]==0)// 表⽰接收到的是数据;
{
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec,1, length -1);// 将接受到的字节数据转化成字符串;
ShowMsg(strMsg);
}
if(arrMsgRec[0]==1)// 表⽰接收到的是⽂件;
{
//SaveFileDialog sfd = new SaveFileDialog();
//SaveFileDialog sfd = new SaveFileDialog();
//if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
//{// 在上边的 sfd.ShowDialog()的括号⾥边⼀定要加上 this 否则就不会弹出另存为的对话框,⽽弹出的是本类的其他窗⼝,,这个⼀定要注意!!!【解释:加了this的sfd.ShowDialog(this),“另存为”窗⼝的指针才能被SaveFileDialog的对象调⽤,若不加thisSaveFileDialog 的对象调⽤的是本类的其他窗⼝了,当然不弹出“另存为”窗⼝。】
string path = System.Windows.Forms.Application.StartupPath +"\\DownFile\\";
//判断该路径下⽂件夹是否存在,不存在的情况下新建⽂件夹
if(!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string fileSavePath = path + Fn;// 获得⽂件保存的路径;
// string fileSavePath = sfd.FileName;// 获得⽂件保存的路径;
// 创建⽂件流,然后根据路径创建⽂件;
using(FileStream fs =new FileStream(fileSavePath, FileMode.Create))
{
fs.Write(arrMsgRec,1, length -1);
ShowMsg("⽂件保存成功:"+ fileSavePath);
}getsavefilename
}
}
}
void ShowMsg(string str)
{
txtMsg.AppendText(str +"\r\n");
}
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog ofd =new OpenFileDialog();
ofd.InitialDirectory ="D:\\";
if(ofd.ShowDialog()== System.Windows.Forms.DialogResult.OK)
{
txtSelectFile.Text = ofd.FileName;
}
}
private void btnSendFile_Click(object sender, EventArgs e)
{
if(string.IsNullOrEmpty(txtSelectFile.Text))
{
MessageBox.Show("请选择你要发送的⽂件!!!");
}
else
{
string path = txtSelectFile.Text;
// ⽤⽂件流打开⽤户要发送的⽂件;
using(FileStream fs =new FileStream(path, FileMode.Open))
{
if(fs.Length >1024*1024*100)
{
MessageBox.Show("⽂件⼤于100M,不能上传");
}
else
{
string fileName = System.IO.Path.GetFileName(path);
string fileExtension = System.IO.Path.GetExtension(path);
string fileExtension = System.IO.Path.GetExtension(path);
string strMsg = fileName;
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);// 将要发送的字符串转换成Utf-8字节数组;
byte[] arrSendMsg =new byte[arrMsg.Length +1];
arrSendMsg[0]=0;// 表⽰发送的是消息数据
Buffer.BlockCopy(arrMsg,0, arrSendMsg,1, arrMsg.Length);
// bool fff = true;
string strKey ="";
strKey = lbOnline.Text.Trim();
string[] selectClient =new string[1024];
byte[] arrFile =new byte[1024*1024*100];
if(string.IsNullOrEmpty(strKey))// 判断是不是选择了发送的对象;
{
int length = fs.Read(arrFile,0, arrFile.Length);// 将⽂件中的数据读到arrFile数组中;
// MessageBox.Show("请选择你要发送的好友!!!");
for(int i =0; i < lbOnline.Items.Count; i++)
{
selectClient[i]= lbOnline.Items[i].ToString();
dict[selectClient[i]].Send(arrSendMsg);// 解决了 sokConnection是局部变量,不能再本函数中引⽤的问题;
int count = lbOnline.Items.Count;
//MessageBox.Show((length).ToString());
byte[] arrFileSend =new byte[length + count];
arrFileSend[0]=1;// ⽤来表⽰发送的是⽂件数据;
Buffer.BlockCopy(arrFile,0, arrFileSend,1, length);
// 还有⼀个 CopyTo的⽅法,但是在这⾥不适合;当然还可以⽤for循环⾃⼰转化;
//  sockClient.Send(arrFileSend);// 发送数据到服务端;
dict[selectClient[i]].Send(arrFileSend);// 解决了 sokConnection是局部变量,不能再本函数中引⽤的问题;                                txtSelectFile.Clear();
count++;
}
}
else
{
dict[strKey].Send(arrSendMsg);// 解决了 sokConnection是局部变量,不能再本函数中引⽤的问题;
//byte[] arrFile = new byte[1024 * 1024 * 100];
int length = fs.Read(arrFile,0, arrFile.Length);// 将⽂件中的数据读到arrFile数组中;
int count = lbOnline.Items.Count;
byte[] arrFileSend =new byte[length + count];
arrFileSend[0]=1;// ⽤来表⽰发送的是⽂件数据;
Buffer.BlockCopy(arrFile,0, arrFileSend,1, length);
// 还有⼀个 CopyTo的⽅法,但是在这⾥不适合;当然还可以⽤for循环⾃⼰转化;
//  sockClient.Send(arrFileSend);// 发送数据到服务端;
dict[strKey].Send(arrFileSend);// 解决了 sokConnection是局部变量,不能再本函数中引⽤的问题;
txtSelectFile.Clear();
}
}
}
}
txtSelectFile.Clear();
}
private void FS()
{
string path = Application.StartupPath +"\\Config.ini";
using(FileStream fs =new FileStream(path, FileMode.Open))
{
if(fs.Length >1024*1024*100)
{
MessageBox.Show("⽂件⼤于100M,不能上传");
}
else
{
string fileName = System.IO.Path.GetFileName(path);
string fileExtension = System.IO.Path.GetExtension(path);
string strMsg = fileName;
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);// 将要发送的字符串转换成Utf-8字节数组;
byte[] arrSendMsg =new byte[arrMsg.Length +1];
arrSendMsg[0]=0;// 表⽰发送的是消息数据
Buffer.BlockCopy(arrMsg,0, arrSendMsg,1, arrMsg.Length);
// bool fff = true;
string strKey ="";
strKey = lbOnline.Items[lbOnline.Items.Count-1].ToString();
//string[] selectClient = new string[1024];
//byte[] arrFile = new byte[1024 * 1024 * 100];
dict[strKey].Send(arrSendMsg);// 解决了 sokConnection是局部变量,不能再本函数中引⽤的问题;
byte[] arrFile =new byte[1024*1024*100];
int length = fs.Read(arrFile,0, arrFile.Length);// 将⽂件中的数据读到arrFile数组中;
int count = lbOnline.Items.Count;
byte[] arrFileSend =new byte[length + count];
arrFileSend[0]=1;// ⽤来表⽰发送的是⽂件数据;
Buffer.BlockCopy(arrFile,0, arrFileSend,1, length);
// 还有⼀个 CopyTo的⽅法,但是在这⾥不适合;当然还可以⽤for循环⾃⼰转化;
//  sockClient.Send(arrFileSend);// 发送数据到服务端;
dict[strKey].Send(arrFileSend);// 解决了 sokConnection是局部变量,不能再本函数中引⽤的问题;
}
}
}
现在服务端已经搭建完成

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。