黑马程序员_.Net多线程Socket编程(对话聊天)
来源:互联网 发布:淘宝充值网易宝 编辑:程序博客网 时间:2024/05/16 17:25
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
下面是个人在黑马里面的相关视频学习到的,简单多线程Socket编程(聊天对话),仅供参考。O(∩_∩)O谢谢~
时间:2013/08/09
并用一台电脑模拟聊天
代码如下:
服务器端
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net.Sockets;using System.Net;using System.Threading;namespace TestThreadSocket{ public partial class Server : Form { public Server() { InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false;//关闭对文本框的线程操作检查(不关闭会导致线程间无法调用) } //*****2013-08-09****** Thread threadWatch=null;//监听服务器端来访线程 Thread threadClient = null;//获取客户端信息线程 Socket sockeWatch=null;//服务端监听套接字 Socket SokConnection = null;//负责对客户通讯的套接字 //存储所有来访问服务器的客户 Dictionary<string, Socket> dict = new Dictionary<string, Socket>(); private void button1_Click(object sender, EventArgs e) { try { //创建服务端负责监听的套接字,参数(使用IP4寻找地址协议,使用流式连接,使用TCP协议传输数据) sockeWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //获得文本框中的IP地址对象 IPAddress address = IPAddress.Parse(txt_IP.Text.Trim()); //创建包含IP和端口的网络节点对象 IPEndPoint endPoint = new IPEndPoint(address,int.Parse(txt_Post.Text.Trim())); //将负责监听的套接字绑定到唯一的IP和端口上 sockeWatch.Bind(endPoint); //设置监听队列的长队 sockeWatch.Listen(10); //创建线程 threadWatch = new Thread(WatchConnecting); //将线程改为后台线程 threadWatch.IsBackground = true; threadWatch.Start();//开启线程 ShowMsg("服务器端监听成功!"); } catch (Exception) { ShowMsg("服务器端监听失败!"); } } //开始监听 void WatchConnecting() { while (true) { try { //开始监听客户端,Accept会阻断当前的线程 需要添加线程解决 SokConnection = sockeWatch.Accept(); threadClient = new Thread(RecMsg); threadClient.IsBackground = true; threadClient.Start(); //向列表控件中添加一个客户端的IP段口字符串,作为客户端的唯一标示 lbOnline.Items.Add(SokConnection.RemoteEndPoint.ToString()); //将于客户端通信的套接字对象SokConnection添加到键值对集合中,并以客户端IP端口作为键 dict.Add(SokConnection.RemoteEndPoint.ToString(), SokConnection); ShowMsg("客户端连接成功!" + SokConnection.RemoteEndPoint.ToString()); } catch (Exception) { } } } //获取客户端数据方法 void RecMsg() { //死循环不断接收 while (true) { byte[] arrMasgRec = new byte[1024 * 1024 * 2]; //获取客户端发来的有效字节长度 int length = SokConnection.Receive(arrMasgRec); //此时是将数组的所有元素都转成字符串,而真正接收到的只有客户端发来的几个字符。其他剩余空间都是空/0;(截取从0到有效的字节长度) string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMasgRec, 0, length); ShowMsg(txt_IP.Text.Trim() + ":" + strMsgRec); } } //显示 void ShowMsg(string msg) { Txt_Concext.AppendText(msg+"\r\n"); } //发送按钮 private void button2_Click(object sender, EventArgs e) { try { //获取发送区内容 string strMsg = txt_Send.Text.Trim(); //将要发送的字符串转成UTF-8对应的字节数组 byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); //获取lbOnline(listbox)中当前选中的客户IP string strClientKey = lbOnline.Text; dict[strClientKey].Send(arrMsg); ShowMsg("发送给"+strClientKey+"数据" + strMsg); } catch (Exception) { ShowMsg("发送失败!"); } } }}示例图片:server
客户端代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net.Sockets;using System.Net;using System.Threading;namespace Client{ public partial class Clinet : Form { public Clinet() { InitializeComponent(); //关闭对文本框的线程操作检查(不关闭会导致线程间无法调用) TextBox.CheckForIllegalCrossThreadCalls=false; } Thread threadClient = null;//客户端接收数据线程线程 Socket socketClient = null;//客户端负责接收服务端的数据 private void button1_Click(object sender, EventArgs e) { //获取IP地址 IPAddress address = IPAddress.Parse(txt_IP.Text.Trim()); //创建包含IP和端口的网络节点对象 IPEndPoint endPoint = new IPEndPoint(address,int.Parse(txt_Post.Text.Trim())); //创建发送套接字 socketClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //发送 socketClient.Connect(endPoint); //实例化线程 监听服务端的信息 threadClient = new Thread(RecMsg); threadClient.IsBackground = true; threadClient.Start(); } //接收服务端数据方法 void RecMsg() { //死循环不断接收 while (true) { //开辟一个2M空间 byte[] arrMasgRec = new byte[1024 * 1024 * 2]; //获取服务端发来的有效字节长度 int length= socketClient.Receive(arrMasgRec); //此时 是将 数组的所有元素都转成字符串,而真正接收到的只有服务端发来的几个字符。其他剩余空间都是空/0; string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMasgRec,0,length); ShowMsg(txt_IP.Text.Trim()+":"+strMsgRec); } } //发送按钮 private void button2_Click(object sender, EventArgs e) { //获取发送数据 string strMsg = txt_Send.Text.Trim(); //编码 byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); //发送 socketClient.Send(arrMsg); ShowMsg("发送给" + txt_IP.Text.Trim() + ":" + strMsg); } //显示 void ShowMsg(string msg) { Txt_Concext.AppendText(msg + "\r\n"); } }}示例图片:
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
- 黑马程序员_.Net多线程Socket编程(对话聊天)
- 黑马程序员_多线程编程
- 黑马程序员_多线程编程
- 黑马程序员_多线程socket聊天室
- 黑马程序员---多线程和socket的编程
- 黑马程序员:Java编程_多线程
- 黑马程序员 关于Socket编程 网络聊天的总结
- 黑马程序员_网络编程之聊天程序
- 黑马程序员_网络编程之简单的聊天程序
- java-socket多线程网络编程案列--搭建本地简易聊天对话服务器
- 《黑马程序员》socket---udp聊天
- 黑马程序员_(UDP-聊天)
- 黑马程序员_客户端聊天软件(网络编程、GUI、线程等)
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- C语言中getenv函数的用法
- 检查金币
- [每日一题] OCP1z0-047 :2013-08-08 相关子查询中EXISTS的使用.....................................28
- 另类杀人游戏
- 基于mini2440的ADC操作(裸机)
- 黑马程序员_.Net多线程Socket编程(对话聊天)
- Spring 3.0 OXM - Spring 3.0 框架新特性
- 素数槽
- LeetCode-Search a 2D Matrix
- Poj 1742 Coins(多重背包)
- How to think like a Computer Scientist: 课后习题第八章
- Pi
- #杜七的飘3#一次做不了几件事
- 面向服务的体系架构(SOA)和业务组件(BC)的思考