关键词不能为空

当前您在: 主页 > 英语 >

C#TCP实现多个客户端与服务端数据与文件的传输

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-08 08:23
tags:

-

2021年2月8日发(作者:维持会)



C#


菜鸟做这个东东竟然花了快三天的时间了 ,真是菜,菜,菜?



F


面是我用


C#


写的一个简单的


TCP


通信,主要的功能有


:


(1)


多个客户端与服务器间的数据交流



(2)


可以实现群发的功能



(3


)


客户端与服务端可以进行文件的传输



主要用到的知识:



TCP

< p>
里的


socket


、、



多线程



Thread


、、



F


面的是界面:





-


孤天弱容户揣



















昵称:雪





连接服势端



发送消息




选择文件



岌送文件



J


鞭天宣底服努蔬



IF



|


昌< /p>


I



|


0


J




S-1


S-.


S-.


s



















































172.16 12.12



FOK


S068


T




在线列表



172.16.12.12:58063


172.


16.12.12:58064



17 2.


IB.


12.12:56065


1T2. 16.12.12:58066


1T2.


IB.


12.12:58067


172.


15.12.12:56068



172.10.


12.12:58069


1T2.


16.12.12


56OT0


选择文件



下面分别是服务端和客户端的代码,如若借用,请标明出处



服务端代码:



[csharp] view pla in copypri nt?


using System;


using t ion neric;


using onen tModel;


using


using ing;


using


using


using


using s;


usi ng //IP




IPAddress, IPE ndPoi nt


,端口等


;


using ing;


using Syste


n amespace _11111


{


public partial class frm_server : Form {


public frm server




{



InitializeComponent();


orIllegalCrossThreadCalls = false;


}




Thread threadWatch = null; //


负责监听客户端连接请求的



Socket socketWatch = null;


线程;



Dictionary dict = new Dictionary();


Dictionary dictThread = new Dictionary();


private void btnBeginListen_Click(object sender, EventArgs e)


{



//


创建负责监听的套接字,注意其中的参数;



socketWatch = new Socket(etwork, , ); //



得文本框中的



IP


对象;



IPAddress address = (());


//


创建包含



ip


和端口号的网络节点对象;



IPEndPoint endPoint = new IPEndPoint(address, (()));


try


{



//


将负责监听的套接字绑定到唯一的



ip


和端口上;



(endPoint);


}



catch (SocketException se)


{



(


异常:




return;


}



//


设置监听队列的长度;



(10);


//


创建负责监听的线程;



threadWatch = new Thread(WatchConnecting);


ground = true;


();


ShowMsg(


服务器启动 监听成功!




//}


}



///


///


监听客户端请求的方法;



///


void WatchConnecting()


{


while (true) //


持续不断的监听客户端的连接请求;



{



//


开始监听客户端连接请求,



Accept


方法会阻断当前的线程;



Socket sokConnection = (); //


一旦监听到一个客户端的请求,就返回一个



与该客


户端通信的



套接字;



//


想列表控件中添加客户端的



IP


信息;



(ng());


//


将与客户端连接的



套接字



对象添加到集合中;



(ng(), sokConnection);



ShowMsg(


客户端连接成功!




Thread thr = new Thread(RecMsg); ground = true;


(sokConnection);


(ng(), thr); //


将新建的线程



添加



到线



程的集合


中去。



}



}



void RecMsg(object sokConnectionparn)


{



Socket sokClient = sokConnectionparn as Socket;


while (true)


{



//


定义一个



2M


的缓存区;



byte[] arrMsgRec = new byte[1024 * 1024 * 2];


//


将接受到的数据存入到输入



arrMsgRec


中;



int length = -1;


try


{



length = e(arrMsgRec); //


接收数据,并返回数据的长度;



}



catch (SocketException se)


{



ShowMsg(


异常:




//




通信套接字



集合中删除被中断连接的通信套接字;



(ng());


//


从通信线程集合中删除被中断连接的通信线程对象;



(ng());


//


从列表中移除被中断的连接



IP (ng());


break;


}



catch (Exception e)


{



ShowMsg(


异常:




//




通信套接字



集合中删除被中断连接的通信套接字;



(ng());


//


从通信线程集合中删除被中断连接的通信线程对象;



(ng());


//


从列表中移除被中断的连接



IP (ng());


break;


}



if (arrMsgRec[0] == 0) //


表示接收到的是数据;



{



string strMsg = ing(arrMsgRec,1, length-1);//


节数据转化成字符串;



ShowMsg(strMsg);


}



将接受到的字



if (arrMsgRec[0] == 1) //


表示接收到的是文件;



{




SaveFileDialog sfd = new SaveFileDialog();


if (alog(this) == )


{//


在上边的



alog


()


的括号里边一定要加上



this


否则就不会弹出



另存为





对话框,而弹


出的是本类的其他窗口,



,这个一定要注意!



!!【解释:加了



this




alog(this)




“另存为



”窗口的指针才能被



SaveFileDialog


的对象调用,若不加



thisSaveFileDialog


的对象调用的


是本类的其他窗口了,当然不弹出



“另存为



”窗口。】



string fileSavePath = me;//


获得文件保存的路径;



//


创建文件流,然后根据路径创建文件;



using (FileStream fs = new FileStream(fileSavePath, ))


{



(arrMsgRec, 1, length - 1);


ShowMsg(


文件保存成功:




}



}



}



}



}



void ShowMsg(string str)


{



Text(str +


}



//


发送消息



private void btnSend_Click(object sender, EventArgs e)


{



string strMsg =


服务器




byte[] arrMsg = es(strMsg); //


将要发送的字符串转换成



Utf-8


字节


数组;



byte[] arrSendMsg=new byte[+1]; arrSendMsg[0] = 0; //


表示发送的是消息数据



opy(arrMsg, 0, arrSendMsg, 1, );


string strKey =


strKey = ();


if (OrEmpty(strKey)) //


判断是不是选择了发送的对象;



{



(


请选择你要发送的好友!



!!




}



else


{



dict[strKey].Send(arrSendMsg);//


解决了



sokConnection


是局部变量,



不能再本函数中引用的



问题;



ShowMsg(strMsg); ();


}



}



///


///


群发消息



///



///


///


消息




private void btnSendToAll_Click(object sender, EventArgs e)


{



string strMsg =


服务器




byte[] arrMsg = es(strMsg); //


将要发送的字符串转换成



Utf-8


字节


数组;



using System;


using c;


using entModel;


using


using g;


using


using


using


using s;


using // IP



IPAddress, IPEndPoint


,端口等;



using ing;


using


namespace _11111


{



public partial class frm_server : Form


{



public frm_server()


{



InitializeComponent();


orIllegalCrossThreadCalls = false;


}



Thread threadWatch = null; //


负责监听客户端连接请求的



线程;



Socket socketWatch = null;


Dictionary dict = new Dictionary();


Dictionary dictThread = new Dictionary();


private void btnBeginListen_Click(object sender, EventArgs e)


{



//


创建负责监听的套接字,注意其中的参数;



socketWatch = new Socket(etwork, ,


);


//


获得文本框中的



IP


对象;



IPAddress address = (());


//


创建包含



ip


和端口号的网络节点对象;



IPEndPoint endPoint = new IPEndPoint(address, (()));


try


{




//


将负责监听的套接字绑定到唯一的



ip


和端口上;



(endPoint);


}



catch (SocketException se)


{



(


异常:




return;


}



//


设置监听队列的长度;



(10);


//


创建负责监听的线程;



threadWatch = new Thread(WatchConnecting);


ground = true; ();


ShowMsg(


服务器启动监听成功!




//}


///


///


监听客户端请求的方法;



///


void WatchConnecting()


{



while (true) //


持续不断的监听客户端的连接请求;



{



//


开始监听客户端连接请求,



Accept


方法会阻断当前的线程;



Socket sokConnection = (); //


一旦监听到一个客户端的




求,就返回一个与该客户端通信的



套接字;



//


想列表控件中添加客户端的



IP


信息;



(ng());


//


将与客户端连接的



套接字



对象添加到集合中;



(ng(), sokConnection); ShowMsg(


客户端连接成功!




Thread thr = new Thread(RecMsg);


ground = true; (sokConnection);


(ng(), thr); //


将新



建的线程



添加



到线程的集合中去。



}



}



void RecMsg(object sokConnectionparn)


{



Socket sokClient = sokConnectionparn as Socket;


while (true)


{



//


定义一个



2M


的缓存区;



byte[] arrMsgRec = new byte[1024 * 1024 * 2];


//


将接受到的数据存入到输入



arrMsgRec


中;



int length = -1;


try


{



length = e(arrMsgRec); //


接收数据,并返回数据



的长



度;



}



catch (SocketException se)


{



ShowMsg(


异常:




//




通信套接字



集合中删除被中断连接的通信套接字;



(ng());


//


从通信线程集合中删除被中断连接的通信线程对象;



(ng());


//


从列表中移除被中断的连接



IP


(ng()); break;


}



catch (Exception e)


{



ShowMsg(


异常:




//




通信套接字



集合中删除被中断连接的通信套接字;



(ng());


//


从通信线程集合中删除被中断连接的通信线程对象;



(ng());


//


从列表中移除被中断的连接



IP


(ng()); break;


}



if (arrMsgRec[0] == 0) //


表示接收到的是数据;



{



string strMsg = ing(arrMsgRec,1,


length-1);//


将接受到的字节数据转化成



字符串;



ShowMsg(strMsg);


}



if (arrMsgRec[0] == 1) //


表示接收到的是文件;



{



SaveFileDialog sfd = new SaveFileDialog();


if (alog(this) ==


)


{//


在上边的



alog


()


的括号里边一定要加上



this


否则就不会弹出



另存为



的对话框,



而弹出的是本类的其他窗口,



,这个一定要注意!



!!



【解释:加了



this




alog(this)




“另存为



”窗口的指针才能被



SaveFileDialog


的对




调用,若不加



thisSaveFileDialog


的对象调用的是本类的其他窗口了,



当然不弹出



“另存为



” 窗


口。】



string fileSavePath = me;//


获得文件保存的路



径;



//


创建文件流,然后根据路径创建文件;



using (FileStream fs


= new FileStream(fileSavePath,


))


(arrMsgRec, 1, length - 1);



ShowMsg(


文件保存成功:




}



}



}



}



void ShowMsg(string str)


{


Text(str +


}



//


发送消息



private void btnSend_Click(object sender, EventArgs e)


{



string strMsg =


服务器




-->


byte[] arrMsg = es(strMsg); //


将要发送的字



符串


转换成



Utf-8


字节数组;



byte[] arrSendMsg=new byte[+1]; arrSendMsg[0] = 0; //


表示发送的是消


息数据



opy(arrMsg, 0, arrSendMsg, 1, ); string strKey =


strKey = ();


if (OrEmpty(strKey))


{


//


判断是不是选择了发送的对象;



(


请选择你要发送的好友!



!!



else


{


dict[strKey].Send(arrSendMsg);//


解决了



sokConnection


是局部变量,



不能




ShowMsg(strMsg); ();


}


本函数中引用的问题;



}



}



///


///


群发消息



///


///


///


消息




private void btnSendToAll_Click(object sender, EventArgs e)


{



string strMsg =


服务器




-->


byte[] arrMsg = es(strMsg); //


将要发送的字



符串


转换成



Utf-8


字节数组;



[csharp] view plaincopyprint?


[csharp] view plaincopyprint?



上次写的



时候把


这一段给弄掉了,



实在是抱歉哈



~


用来标识发送是数据而不是文件,



如果没有这一段



的客户端就接


收不到消息了



~~~


arrSendMsg[0] = 0; //


表示发送的是消息数据




opy(arrMsg, 0, arrSendMsg, 1, );


byte[] arrSendMsg = new byte[ + 1]; //


上次写的时候把这一段给



弄掉


了,



实在是抱歉哈



~


用来标识发送是数据而不是文件,



如果没有这一段的客户端就接收



不到消息了



~~~



arrSendMsg[0] = 0; //


表示发送的是消息数据



opy(arrMsg, 0, arrSendMsg, 1, );


[csharp] view plaincopyprint?


foreach (Socket s in )


{



(arrMsg);


}



ShowMsg(strMsg);


();


ShowMsg


(”


群发完毕



------


”)




}



//


选择要发送的文件



private void btnSelectFile_Click_1(object sender, EventArgs e)


{



OpenFileDialog ofd = new OpenFileDialog()




lDirectory =




if (alog() == )


{



= me




}



}



//


文件的发送



private void btnSendFile_Click_1(object sender, EventArgs e)


{



if (OrEmpty())


{



(


请选择你要发送的文件!



!!






}



else


{



//


用文件流打开用户要发送的文件;



using (FileStream fs = new FileStream(, ))


{



string fileName=eName();


string fileExtension=ension();


string strMsg =


我给你发送的文件为:




byte[] arrMsg = es(strMsg); //


将要发送的字符串转换成



Utf-8


字节


数组;



byte[] arrSendMsg = new byte[ + 1]; arrSendMsg[0] = 0; //


表示发送的是消息数据



opy(arrMsg, 0, arrSendMsg, 1, );


bool fff = true;

-


-


-


-


-


-


-


-



本文更新与2021-02-08 08:23,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/613262.html

C#TCP实现多个客户端与服务端数据与文件的传输的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文