1、主界面
2、源代碼
Client
public partial class FormClient : Form { //聲明一個Socket public Socket newClient; //判斷是否連接成功 public bool isConnected; //定義一個線程 public Thread myThread; //定義一個委托 public delegate void MyInvoke(string str); public FormClient() { InitializeComponent(); } private void Connection() { //IPAddress ip=null; //int port=888; byte[]data=new byte[1024]; //創建一個新的Socket newClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //獲取IP地址 #region GetIP //if (txtIP.Text == string.Empty) //{ // MessageBox.Show("遠程IP不能為空"); //} //else //{ // string pattrn = @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))"; // if (System.Text.RegularExpressions.Regex.IsMatch(txtIP.Text.Trim(), pattrn)) // { // ip = IPAddress.Parse(txtIP.Text.Trim()); // } // else // { // MessageBox.Show("IP地址格式不正確!"); // } //} #endregion //獲取端口號 #region GetPort //if (System.Text.RegularExpressions.Regex.IsMatch(@"^[-]?\d+[.]?\d*$", txtPort.Text.Trim())) //{ // port = Convert.ToInt32(txtPort.Text.Trim()); //} //else //{ // MessageBox.Show("端口號格式不正確"); //} #endregion //封裝網絡端點 IPEndPoint ie = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()),Convert.ToInt32(txtPort.Text.Trim())); #region Connection try { //建立與遠程主機之間的連接 newClient.Connect(ie); //設置連接服務器控件的屬性 // btnConnection.Enabled = false; //設置連接狀況 btnConnection.Text = "停止連接"; //isConnected = true; } catch (SocketException ex) { MessageBox.Show("連接服務器失敗" + ex.Message); return; } #endregion //啟動當前線程用於接收消息 ThreadStart myThreadDelegate = new ThreadStart(ReceiveMessage); myThread = new Thread(myThreadDelegate); myThread.Start(); } /// <summary> /// 接收消息 /// </summary> public void ReceiveMessage() { while (true) { //定義字節數組大小 byte[]data=new byte[1024]; //獲取數組長度 int recv = newClient.Receive(data); //接收數據 string strData = Encoding.UTF8.GetString(data, 0, recv); //顯示信息 ShowMessage(newClient.RemoteEndPoint.ToString()+":"+strData+"\r\n"); } } /// <summary> /// 顯示消息 /// </summary> /// <param name="msg">接收的消息,可能來自Client/也可能來自Server</param> public void ShowMessage(string msg) { //如果是在創建該控件以外的線程調用該控件 if (lbMessage.InvokeRequired) { MyInvoke myInvoke = new MyInvoke(ShowMessage); //lbMessage.Invoke(myInvoke, new object[] { msg }); lbMessage.Invoke(myInvoke,new object[]{"遠程主機:"+msg}); } else { lbMessage.Items.Add(msg); } } private void btnSend_Click(object sender, EventArgs e) { if (txtSendMessage.Text == null) { txtSendMessage.Text = "發送消息不能為空"; //停留1秒消失 } else { //獲取發送數據長度 int myMessLength = txtSendMessage.Text.Length; //將數據轉換為字節數組 byte[] data = new byte[myMessLength]; data = Encoding.UTF8.GetBytes(txtSendMessage.Text); //發送數據 int i = newClient.Send(data); //將數據顯示在Client ShowMessage("我說:" + txtSendMessage.Text + "\r\n"); } } private void btnConnection_Click(object sender, EventArgs e) { if (btnConnection.Text == "連接服務") { Connection(); } else { newClient.Close(); } } private void FormClient_Load( object sender, EventArgs e ) { } }
Server
public partial class Form1 : Form { public Form1() { InitializeComponent(); } public Thread myThread;//聲明一個線程實例 public Socket newSocket;//聲明一個Socket實例 public Socket serverSocket;//聲明服務端Socket實例 public Socket clientSocket;//聲明客戶端Socket public delegate void MyInvoke(string str);//聲明一個委托 public IPEndPoint localEP;//聲明本地網絡端點 public EndPoint remote;//聲明網絡地址 public int localPort;//聲明本地端口號 public Boolean isListening;//聲明服務端是否監聽 public Hashtable _sessionTable;//用於記錄用戶信息 public bool btnState=true; //設置服務端監聽的端口號屬性 public int SetPort { get { return localPort; } set { localPort = value; } } //設置監聽 public void Listening() { SetPort = int.Parse(txtPort.Text.Trim());//設置端口號 newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化Socket實例 newSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);//允許Socket被綁定在已使用的地址上 localEP = new IPEndPoint(IPAddress.Any, SetPort);//初始化網絡端點信息 try { _sessionTable = new Hashtable( 50 ); newSocket.Bind(localEP);//綁定端口 newSocket.Listen(10);//開始監聽 newSocket.BeginAccept(new AsyncCallback(OnConnectRequest),newSocket);//開始異步接受連接 } catch(Exception ex) { ShowMessage(ex.ToString()); } } private void btnStartServer_Click(object sender, EventArgs e) { ThreadStart myThreadDelegate = new ThreadStart(Listening);//新建一個線程用於委托 myThread = new Thread(myThreadDelegate); if (btnState) { myThread.Start(); stateBar.Text = "服務已經啟動,等待客戶端連接"; btnState = false; btnStartServer.Text = "停止服務"; } else { myThread.Interrupt(); myThread.Abort(); btnState = true; btnStartServer.Text = "開始服務"; stateBar.Text = "服務已停止"; } } //顯示信息 public void ShowMessage(string msg) { if (rtbMessage.InvokeRequired) { MyInvoke myInvoke = new MyInvoke(ShowMessage); rtbMessage.Invoke(myInvoke, new object[] { msg }); } else { rtbMessage.AppendText(msg); } } public void OnConnectRequest(IAsyncResult ar) { serverSocket = (Socket)ar.AsyncState; clientSocket = serverSocket.EndAccept(ar);//異步接收連接 string welcomeStr = "歡迎登陸到服務器"; byte[] data = System.Text.Encoding.UTF8.GetBytes(welcomeStr); remote = clientSocket.RemoteEndPoint;//獲取遠程終點信息 ShowMessage(remote.ToString()+" 連接成功 "+DateTime.Now.ToString()+"\r\n"); clientSocket.Send(data,data.Length,0); UserListOperate(clientSocket.RemoteEndPoint.ToString()); _sessionTable.Add(clientSocket.RemoteEndPoint,null);//將連接成功的客戶端實例添加到哈希表中 serverSocket.BeginAccept(new AsyncCallback(OnConnectRequest), serverSocket);//等待新的客戶端連接 //接收數據 ReceiveMessage(); } //接收數據 public void ReceiveMessage () { while (true) { byte[]data=new byte[1024]; int recv = clientSocket.Receive( data ); string message = Encoding.UTF8.GetString(data,0,recv); ShowMessage(clientSocket.RemoteEndPoint.ToString()+":"+message+"\r\n"); } } //添加用戶列表 public void UserListOperate(string msg) { //在線程里以安全的方式調用控件 if (lbUserList.InvokeRequired) { MyInvoke myInvoke = new MyInvoke(UserListOperate); lblUserList.Invoke(myInvoke, new object[] { msg }); } else { lbUserList.Items.Add(msg); } } //刪除用戶列表 public void UserListOperateRemove(string msg) { if (lbUserList.InvokeRequired) { MyInvoke myInvoke = new MyInvoke(UserListOperateRemove); lbUserList.Invoke(myInvoke, new object[] { msg }); } else { lbUserList.Items.Remove(msg); } } //發送廣播 public void BroadCast() { string strMessage = txtMessage.Text; Byte[] data = Encoding.UTF8.GetBytes(strMessage); foreach (DictionaryEntry item in _sessionTable) { EndPoint temp = (EndPoint)item.Key; clientSocket.SendTo(data, temp); ShowMessage("我:"+strMessage+"\r\n"); } txtMessage.Text = ""; } private void Form1_Load(object sender, EventArgs e) { //獲取本機IP IPAddress[] ip = Dns.GetHostByName( Dns.GetHostName() ).AddressList; lblIP.Text+=ip[0].ToString(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //窗體關閉時判斷線程是否為空 if (myThread != null) { myThread.Abort(); } throw new Exception(); } private void btnSend_Click(object sender, EventArgs e) { BroadCast(); } }
如有不當之處,煩請指教。