c# WINFORM SOCKET编程-简单聊天程序(服务端)
生活随笔
收集整理的這篇文章主要介紹了
c# WINFORM SOCKET编程-简单聊天程序(服务端)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
初學C#的SOCKET編程,照著網上的代碼寫下來,程序總是有問題,經過自己長時間的調試,完成程序,以下是原碼,有需要可以參考一下,還不完善,歡迎大家批評指正。(這里的代碼沒更新,附件重新上傳更新,在另一個線程中使用委托來修改控件的屬性,發送廣播功能還有問題,稍修更新修正。) 環境:VS2008 .NET3.5 網上給出的程序都是控制臺程序,我這個是WINFORM程序。有詳細的說明,以服務端程序。 需要增加的命名空間: using System.Threading;
using System.Net;
using System.Net.Sockets; 以下是具體實現。 namespace TCPServer
{
????????public partial class Form1 : Form
????????{
????????????????public Form1()
????????????????{
????????????????????????InitializeComponent();
????????????????????????
????????????????}
????????????????public bool btnstatu = true;????//開始停止服務按鈕狀態
????????????????public Thread myThread;???????????? //聲明一個線程實例
????????????????public Socket newsock;????????????????//聲明一個Socket實例
????????????????public Socket Client;????????????????????
????????????????public IPEndPoint localEP;????????
????????????????public int localPort;
????????????????public bool m_Listening;
????????????????//用來設置服務端監聽的端口號
????????????????public int setPort????????????????????????
????????????????{
????????????????????????get { return localPort; }
????????????????????????set { localPort = value; }
????????????????}
????????????????
????????????????//用來往richtextbox框中顯示消息
????????????????public void showClientMsg(string msg)
????????????????{
????????????????????????showClientMsg(msg+"\r\n");
????????????????}
????????????????//監聽函數
????????????????public void Listen()
????????????????{???? //設置端口
????????????????????????setPort=int.Parse(serverport.Text.Trim());
????????????????????????//初始化SOCKET實例
????????????????????????newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
????????????????????????//初始化終結點實例
????????????????????????localEP=new IPEndPoint(IPAddress.Any,setPort);
????????????????????????try
????????????????????????{
????????????????????????????????//綁定
????????????????????????????????newsock.Bind(localEP);
????????????????????????????????//監聽
????????????????????????????????newsock.Listen(10);
????????????????????????????????//用于設置按鈕狀態
????????????????????????????????m_Listening = true;
????????????????????????????????//開始接受連接,異步。
????????????????????????????????newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
???????????????????????? }
????????????????????????catch (Exception ex)
????????????????????????{
????????????????????????????????showClientMsg(ex.Message);
????????????????????????}
????????????????}
????????????????//當有客戶端連接時的處理
????????????????public void OnConnectRequest(IAsyncResult ar)
????????????????{
???????????????????? //初始化一個SOCKET,用于其它客戶端的連接
????????????????????????Socket server1 = (Socket)ar.AsyncState;
????????????????????????Client = server1.EndAccept(ar);
????????????????????????//將要發送給連接上來的客戶端的提示字符串
????????????????????????string strDateLine = "Welcome here";
????????????????????????Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(strDateLine);
????????????????????????//將提示信息發送給客戶端
????????????????????????Client.Send(byteDateLine, byteDateLine.Length, 0);
????????????????????????//等待新的客戶端連接
????????????????????????server1.BeginAccept(new AsyncCallback(OnConnectRequest), server1);
????????????????????????while (true)
????????????????????????{
????????????????????????????????int recv = Client.Receive(byteDateLine);
????????????????????????????????string stringdata = Encoding.ASCII.GetString(byteDateLine, 0, recv);
????????????????????????????????DateTimeOffset now = DateTimeOffset.Now;
????????????????????????????????//獲取客戶端的IP和端口
????????????????????????????????string ip = Client.RemoteEndPoint.ToString();
????????????????????????????????if (stringdata == "STOP")
????????????????????????????????{
????????????????????????????????????????//當客戶端終止連接時
????????????????????????????????????????showinfo.AppendText(ip+"已從服務器斷開");
????????????????????????????????????????break;????
????????????????????????????????}
????????????????????????????????//顯示客戶端發送過來的信息
????????????????????????????????showinfo.AppendText(ip + "????" + now.ToString("G") + "???? " + stringdata + "\r\n");????????????????????????????
????????????????????????}
????????????????????????????????????????????????
????????????????}
????????????//開始停止服務按鈕
????????????????private void startService_Click(object sender, EventArgs e)
????????????????{
????????????????????????//新建一個委托線程
????????????????????????ThreadStart myThreadDelegate = new ThreadStart(Listen);
????????????????????????//實例化新線程
????????????????????????myThread = new Thread(myThreadDelegate);
????????????????????????????
????????????????????????if (btnstatu)
????????????????????????{
????????????????????????????????
????????????????????????????????myThread.Start();
????????????????????????????????statuBar.Text = "服務已啟動,等待客戶端連接";
????????????????????????????????btnstatu = false;
????????????????????????????????startService.Text = "停止服務";
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????????//停止服務(功能還有問題,無法停止)
????????????????????????????????m_Listening = false;
????????????????????????????????newsock.Close();
????????????????????????????????myThread.Abort();
????????????????????????????????showClientMsg("服務器停止服務");
????????????????????????????????btnstatu = true;
????????????????????????????????startService.Text = "開始服務";
????????????????????????????????statuBar.Text = "服務已停止";
????????????????????????????????m_Listening = false;
????????????????????????}
????????????????????????????
????????????????}
????????????????//窗口關閉時中止線程。
????????????????private void Form1_FormClosing(object sender, FormClosingEventArgs e)
????????????????{
????????????????????????if (myThread != null)
????????????????????????{
????????????????????????????????myThread.Abort();
????????????????????????}
????????????????}
????????}
}
using System.Net;
using System.Net.Sockets; 以下是具體實現。 namespace TCPServer
{
????????public partial class Form1 : Form
????????{
????????????????public Form1()
????????????????{
????????????????????????InitializeComponent();
????????????????????????
????????????????}
????????????????public bool btnstatu = true;????//開始停止服務按鈕狀態
????????????????public Thread myThread;???????????? //聲明一個線程實例
????????????????public Socket newsock;????????????????//聲明一個Socket實例
????????????????public Socket Client;????????????????????
????????????????public IPEndPoint localEP;????????
????????????????public int localPort;
????????????????public bool m_Listening;
????????????????//用來設置服務端監聽的端口號
????????????????public int setPort????????????????????????
????????????????{
????????????????????????get { return localPort; }
????????????????????????set { localPort = value; }
????????????????}
????????????????
????????????????//用來往richtextbox框中顯示消息
????????????????public void showClientMsg(string msg)
????????????????{
????????????????????????showClientMsg(msg+"\r\n");
????????????????}
????????????????//監聽函數
????????????????public void Listen()
????????????????{???? //設置端口
????????????????????????setPort=int.Parse(serverport.Text.Trim());
????????????????????????//初始化SOCKET實例
????????????????????????newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
????????????????????????//初始化終結點實例
????????????????????????localEP=new IPEndPoint(IPAddress.Any,setPort);
????????????????????????try
????????????????????????{
????????????????????????????????//綁定
????????????????????????????????newsock.Bind(localEP);
????????????????????????????????//監聽
????????????????????????????????newsock.Listen(10);
????????????????????????????????//用于設置按鈕狀態
????????????????????????????????m_Listening = true;
????????????????????????????????//開始接受連接,異步。
????????????????????????????????newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
???????????????????????? }
????????????????????????catch (Exception ex)
????????????????????????{
????????????????????????????????showClientMsg(ex.Message);
????????????????????????}
????????????????}
????????????????//當有客戶端連接時的處理
????????????????public void OnConnectRequest(IAsyncResult ar)
????????????????{
???????????????????? //初始化一個SOCKET,用于其它客戶端的連接
????????????????????????Socket server1 = (Socket)ar.AsyncState;
????????????????????????Client = server1.EndAccept(ar);
????????????????????????//將要發送給連接上來的客戶端的提示字符串
????????????????????????string strDateLine = "Welcome here";
????????????????????????Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(strDateLine);
????????????????????????//將提示信息發送給客戶端
????????????????????????Client.Send(byteDateLine, byteDateLine.Length, 0);
????????????????????????//等待新的客戶端連接
????????????????????????server1.BeginAccept(new AsyncCallback(OnConnectRequest), server1);
????????????????????????while (true)
????????????????????????{
????????????????????????????????int recv = Client.Receive(byteDateLine);
????????????????????????????????string stringdata = Encoding.ASCII.GetString(byteDateLine, 0, recv);
????????????????????????????????DateTimeOffset now = DateTimeOffset.Now;
????????????????????????????????//獲取客戶端的IP和端口
????????????????????????????????string ip = Client.RemoteEndPoint.ToString();
????????????????????????????????if (stringdata == "STOP")
????????????????????????????????{
????????????????????????????????????????//當客戶端終止連接時
????????????????????????????????????????showinfo.AppendText(ip+"已從服務器斷開");
????????????????????????????????????????break;????
????????????????????????????????}
????????????????????????????????//顯示客戶端發送過來的信息
????????????????????????????????showinfo.AppendText(ip + "????" + now.ToString("G") + "???? " + stringdata + "\r\n");????????????????????????????
????????????????????????}
????????????????????????????????????????????????
????????????????}
????????????//開始停止服務按鈕
????????????????private void startService_Click(object sender, EventArgs e)
????????????????{
????????????????????????//新建一個委托線程
????????????????????????ThreadStart myThreadDelegate = new ThreadStart(Listen);
????????????????????????//實例化新線程
????????????????????????myThread = new Thread(myThreadDelegate);
????????????????????????????
????????????????????????if (btnstatu)
????????????????????????{
????????????????????????????????
????????????????????????????????myThread.Start();
????????????????????????????????statuBar.Text = "服務已啟動,等待客戶端連接";
????????????????????????????????btnstatu = false;
????????????????????????????????startService.Text = "停止服務";
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????????//停止服務(功能還有問題,無法停止)
????????????????????????????????m_Listening = false;
????????????????????????????????newsock.Close();
????????????????????????????????myThread.Abort();
????????????????????????????????showClientMsg("服務器停止服務");
????????????????????????????????btnstatu = true;
????????????????????????????????startService.Text = "開始服務";
????????????????????????????????statuBar.Text = "服務已停止";
????????????????????????????????m_Listening = false;
????????????????????????}
????????????????????????????
????????????????}
????????????????//窗口關閉時中止線程。
????????????????private void Form1_FormClosing(object sender, FormClosingEventArgs e)
????????????????{
????????????????????????if (myThread != null)
????????????????????????{
????????????????????????????????myThread.Abort();
????????????????????????}
????????????????}
????????}
}
轉載于:https://blog.51cto.com/zhupengyue/324869
總結
以上是生活随笔為你收集整理的c# WINFORM SOCKET编程-简单聊天程序(服务端)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC 2入门演练 3
- 下一篇: 关于对话框DoModal()函数调用失败