代码篇C#网络编程之局域网聊天
2015-09-13 13:59
531 查看
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace _008_局域网聊天室 { public partial class Form1 : Form { //--tcplistener private TcpListener myTcpListener; //--创建接收客户端连接线程 private Thread AcceptClientThread; //-- private Dictionary<string, Socket> ClientSocketDic; //-- private TcpClient tcpClient; //-- private delegate void ReceiveClientCallBack(string endPoint); private ReceiveClientCallBack receiveClientCallBack; //-删除客户端回调 private delegate void DeleteClientCallBack(int index); private DeleteClientCallBack deleteClientCallBack; //---添加消息回调 private delegate void ShowMessageCallBack(string text); private ShowMessageCallBack showMessageCallBack; public Form1() { InitializeComponent(); } //---启动服务器按钮被单击事件 private void btn_start_Click(object sender, EventArgs e) { try { ///---创建IP终端节点 IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(textbox_serverIP.Text), Convert.ToInt32(textbox_serverPort.Text)); //--创建实例化TCP连接监听器 myTcpListener = new TcpListener(ipEndPoint); //---启动监听 myTcpListener.Start(); //--实例化接收客户端连接请求 AcceptClientThread = new Thread(AcceptClient); AcceptClientThread.IsBackground = true; AcceptClientThread.Start(); } catch(Exception ex) { MessageBox.Show(ex.Message); } } //---接收客户端连接请求 private void AcceptClient() { try { while (true) { tcpClient = myTcpListener.AcceptTcpClient(); Thread ReceiveThread = new Thread(ClientService); ReceiveThread.IsBackground = true; ReceiveThread.Start(); //---更新客户端列表 listbox_client.Invoke(receiveClientCallBack, tcpClient.Client.RemoteEndPoint.ToString()); //---将客户端加入字典 ClientSocketDic.Add(tcpClient.Client.RemoteEndPoint.ToString(), tcpClient.Client); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } //---客户端服务线程 private void ClientService() { //-- TcpClient client = tcpClient; //-- string endPoint = tcpClient.Client.RemoteEndPoint.ToString(); NetworkStream ns = tcpClient.GetStream(); while(true) { try { int readLen = client.Available; if (0 < readLen) { byte[] getData = new byte[1024]; ns.Read(getData, 0, getData.Length); string getMsg = Encoding.Default.GetString(getData); if (0 == getMsg.Replace("\0", "").Length) { //--掉线 for (int i = 0; i < listbox_client.Items.Count; i++) { if (string.Equals(endPoint, listbox_client.Items[i].ToString())) { listbox_client.Invoke(deleteClientCallBack, i); } } //---将掉线客户端从字典删除 ClientSocketDic.Remove(endPoint); break; } //--将消息添加至消息列表 listbox_message.Invoke(showMessageCallBack, getMsg.Replace("\0","")); //--消息转发 for (int i = 0; i < listbox_client.Items.Count; i++) { if (!string.Equals(endPoint, listbox_client.Items[i].ToString())) { ClientSocketDic[listbox_client.Items[i].ToString()].Send(Encoding.Default.GetBytes(endPoint + ":" + getMsg.Replace("\0", ""))); } } } } catch(Exception ex) { MessageBox.Show(ex.Message); if (null != ns) { ns.Dispose(); } } } } private void Form1_Load(object sender, EventArgs e) { //---初始化回调委托 receiveClientCallBack = new ReceiveClientCallBack(NewClient); deleteClientCallBack = new DeleteClientCallBack(DeleteClient); showMessageCallBack = new ShowMessageCallBack(ShowMessage); ClientSocketDic = new Dictionary<string,Socket>; } //---添加客户端回调方法 private void NewClient(string text) { listbox_client.Items.Add(text); } //---删除客户端回调委托 private void DeleteClient(int index) { listbox_client.Items.RemoveAt(index); } //---显示消息回调方法 private void ShowMessage(string text) { listbox_message.Items.Add(text); } } }
相关文章推荐
- 5、Android网络编程
- windows 故障转移群集
- 公钥加密体系和https
- 蘑菇街的IM 网络层
- 网络协议
- 网络连接之——HttpClient(doGet和doPost)
- CCF 无线网络【最短路】
- http请求头
- netfilter/iptables全攻略
- Andrew Ng Machine Learning 专题【Neural Networks】下
- 关于升级到win10后的网络问题
- 未找到 Oracle 客户端和网络组件问题
- 【网络】(五)避免僵尸进程
- Android OkHttp完全解析 是时候来了解OkHttp了
- Http 协议,WebSocket 协议
- HTTP Content-type
- HTTP缓存相关头
- 第三十六天 网络连接、单线程、多线程下载
- 通过NodeJS,Express搭建本地HTTP访问服务.
- TCP/IP协议三次握手与四次握手流程解析