初學C#的SOCKET程式設計,照着網上的代碼寫下來,程式總是有問題,經過自己長時間的調試,完成程式,以下是原碼,有需要可以參考一下,還不完善,歡迎大家批評指正。(在一個線程中修改另一個窗體的控件。不安全的方式。)
源碼在附件中。
網上給出的程式都是控制台程式,我這個是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 = "服務已停止";
//視窗關閉時中止線程。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
if (myThread != null)
}
}