C# 使用Tcp/Udp协议的示例代码
所使用的:多线程委托Socket键值队
个人跟着视频做的一个小练习,有兴趣的可以去看一下对于初学者来讲是比较有帮助的
连接:https://www.bilibili.com/video/BV1bZ4y1W74q?p=3&t=358
废话不多说上代码 综合视频中的理解有什么不对的地方希望大神指点一下
publicpartialclassForm1:Form { publicForm1() { InitializeComponent(); myAddOnlieDelegate=AddOnlie; myAddTextDelegate=AddTexr; } privatevoidAddTexr(stringstr) { //将文字追加到文本中 txt_centext.AppendText(str); } //////委托方法 /// ////// privatevoidAddOnlie(stringstr,boolbl) { if(bl) { //如果是true的话对listbox.Item进行一个添加 listOne.Items.Add(str); } else { //反之删除 listOne.Items.Remove(str); } } //实例化Socket Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //接口 Threadthread=null; //键值队 Dictionary Dic=newDictionary (); //委托 delegatevoidMyAddOnlieDelegate(stringstr,boolbl); delegatevoidMyAddTextDelegate(stringstr); MyAddOnlieDelegatemyAddOnlieDelegate; MyAddTextDelegatemyAddTextDelegate; privatevoidbutton1_Click(objectsender,EventArgse) { #region第一步获取IP和端口进行相互通信 //获取IP IPAddressIP=IPAddress.Parse(txt_IP.Text.Trim()); //把IP和端口号放在IPEndPoint中 IPEndPointIEnd=newIPEndPoint(IP,int.Parse(txt_port.Text.Trim())); try { //和socket进行关联 socket.Bind(IEnd); MessageBox.Show("服务器开启成功!"); } catch(Exceptionex) { //失败了直接return出去 MessageBox.Show("服务器开启失败"+ex.Message); return; } //socket可以对多少个客户端进行监视 socket.Listen(10); #endregion #region第二部开启多线程 //开始进行多线程操作开始执行此线程时要调用的方法的 thread=newThread(ListenConnectingl); //此线程则为后台线程 thread.IsBackground=true; //启动线程 thread.Start(); //连接到服务器后把按钮禁用掉 button1.Enabled=false; #endregion } /// ///正在进行的后台线程的方法 /// privatevoidListenConnectingl() { //线程使用时进行循环 while(true) { //创建一个新的Socket列:如果有一个新的客户端来连接服务器给他一个Socket SocketsocketConnect=socket.Accept(); //把谁连接的客户端给到skt中字符串 stringskt=socketConnect.RemoteEndPoint.ToString(); Dic.Add(skt,socketConnect); Invoke(myAddOnlieDelegate,skt,true); //更新设备列表需要接受来自不同客户端的消息接着在开一个线程 Threadthr=newThread(ReceiveMsg); thr.IsBackground=true; thr.Start(socketConnect); } } //////开的发送接受的线程直接从上面传递过来参数vs中没显示用什么类型的视频中vs显示可以使用object类型所有类型的基类来展示带参的 /// ///privatevoidReceiveMsg(objectsocketConnect) { //as:转换强转把object转换成Socket Socketso=socketConnectasSocket; while(true) { byte[]arr=newbyte[1024*1024*2]; //定义一个变量 intLength=-1; //try //{ //Receive返回的是一个int类型的数据如果没有的直接关闭掉 Length=so.Receive(arr); //} //catch(Exception) //{ ////如果字节数没有的话把他移除掉 //stringstr=so.RemoteEndPoint.ToString(); //Dic.Remove(str); ////引用的委托 ////Invoke(myAddTextDelegate,str+"下线了"); //Invoke(myAddOnlieDelegate,str,false); //break; //} //加的if判断条件 if(Length==0) { //如果字节数没有的话把他移除掉 stringstr=so.RemoteEndPoint.ToString(); Dic.Remove(str); //引用的委托 Invoke(myAddOnlieDelegate,str,false); break; } else { //如果成功把接受的byte转换成string stringstr=Encoding.UTF8.GetString(arr); Invoke(myAddTextDelegate,str+Environment.NewLine); } } } /// ///发送消息只能发送字节流 /// ////// privatevoidbutton2_Click(objectsender,EventArgse) { //要发送的文字 stringstr=txt_gocentext.Text.Trim(); byte[]bt=Encoding.UTF8.GetBytes(str); /// if(listOne.SelectedItems.Count==0) { MessageBox.Show("请选择要发送的对象"); } else { foreach(StringiteminlistOne.SelectedItems) { //send发送到指定的socket中 Dic[item].Send(bt); stringMsg="[发送]"+item+""+str+System.Environment.NewLine; //使用一个委托直接写入 Invoke(myAddTextDelegate,Msg+Environment.NewLine); } } } privatevoidbutton3_Click(objectsender,EventArgse) { Form2form2=newForm2(); form2.Show(); } }
以上就是C#使用Tcp/Udp协议的示例代码的详细内容,更多关于C#使用Tcp/Udp协议的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。