C#伺服器端與客戶端的通訊(伺服器端)
Tcp協議+socket
1.伺服器端開始監聽
//通過winform視窗輸入的伺服器ip地址和埠號
myip = IPAddress.Parse(textBox1.Text);
myport = Int32.Parse(textBox2.Text);
//將ip地址和 埠號放入終端
myserver = new IPEndPoint(myip, myport);
//伺服器端開始監聽
TcpListener listener = new TcpListener(myServer);
//伺服器端可以接受50個客戶端連入
listener.Start(50);
control = true;
//呼叫執行緒
Thread thread = new Thread(new ThreadStart(Accepttargett));
thread.Start();
//在伺服器端寫一個事件,用於客戶端登陸
private void Accepttargett()
{
while (control)
{
try
{
ClientSock = listener.AcceptSocket();
}
catch
{
continue;
}
//接受到資訊
Byte[] bta = new Byte[1024];
int p = ClientSock.Receive(bta, bta.Length, 0);
string name = System.Text.Encoding.Default.GetString(bta, 0, p);
//登陸連結時做的操作
int a = name.IndexOf("-");
//substring的用法:(起始位,擷取個數)
string name1 = name.Substring(3, a-3);
string Pwd = name.Substring(a + 1, p - a - 1);
//呼叫自己寫的資料庫操作語句判斷接收到的使用者名稱和密碼是否正確
xyhsql xyh = new xyhsql();
bool userlevel = xyh.CheckUser(name1, Pwd);
if (userlevel == true)
{
//如果真確則傳送true到使用者端
bta = System.Text.Encoding.Default.GetBytes("true".ToCharArray());
ClientSock.Send(bta);
//因為伺服器允許50個客戶端連入,所以再針對每個連入使用者建立執行緒和socket對應操作
Thread thread = new Thread(new ParameterizedThreadStart(targett1));
thread.Start(ClientSock);
}
else
{
//如果不正確則傳送false到使用者端
bta = System.Text.Encoding.Default.GetBytes("false".ToCharArray());
ClientSock.Send(bta);
}
}
}
//事件,使用者處理每個使用者的操作,
private void targett1(object sock)
{
Socket workSocket = (Socket)sock;
// Byte[] bta = new Byte[4096];
string sta;
int k;
//當該工作執行緒是與對應的使用者連線這的時候進入迴圈去接收使用者傳送來的資訊
while(workSocket.Connected)
{
Byte[] bta = new Byte[4096];
try
{
//接收到的字元數
k = workSocket.Receive(bta, bta.Length, 0);
}
catch
{
break;
}
//接受到的資訊前三個用於判斷使用者進行的操作
if(k>3)
{
sta = System.Text.Encoding.Default.GetString(bta, 0, k);
//如果是查詢餘額的操作
if (sta.Substring(0,3)=="***")
{
string cxid = sta.Substring(3, sta.Length - 3);
string strsql = "SELECT * FROM admin where uname='" + cxid + "'";
DataSet ds= xyhsql.Query(strsql);
if(ds.Tables[0].Rows.Count!=0)
{
string stc = ds.Tables[0].Rows[0]["uyue"].ToString();
bta = System.Text.Encoding.Default.GetBytes(stc.ToCharArray());
workSocket.Send(bta);
}
continue;
}
//存錢操作
else if(sta.Substring(0, 3) == "ins")
{
int a = sta.IndexOf("-");
string cxid = sta.Substring(3, a - 3);
int money = int.Parse(sta.Substring(a+1, sta.Length - a-1));
bool xyh = cq(cxid, money);
if (xyh == true)
{
bta = System.Text.Encoding.Default.GetBytes("true".ToCharArray());
ClientSock.Send(bta);
}
else
{
bta = System.Text.Encoding.Default.GetBytes("false".ToCharArray());
ClientSock.Send(bta);
}
}
//取錢操作
else if (sta.Substring(0, 3) == "get")
{
int a = sta.IndexOf("-");
string cxid = sta.Substring(3, a - 3);
int money = int.Parse(sta.Substring(a + 1, sta.Length - a - 1));
bool xyh = qq(cxid, money);
if (xyh==true)
{
bta = System.Text.Encoding.Default.GetBytes("true".ToCharArray());
ClientSock.Send(bta);
}
else
{
bta = System.Text.Encoding.Default.GetBytes("false".ToCharArray());
ClientSock.Send(bta);
}
}
//轉賬操作
else if (sta.Substring(0, 3) == "zhz")
{
int a = sta.IndexOf("-");
int b = sta.IndexOf("+");
string cxid1 = sta.Substring(3, a - 3);
string cxid2 = sta.Substring(a + 1, b - a - 1);
int money = int.Parse(sta.Substring(b + 1, sta.Length - b - 1));
bool xyh1 = qq(cxid1, money);
bool xyh2 = cq(cxid2, money);
if(xyh1==true&&xyh2==true)
{
bta = System.Text.Encoding.Default.GetBytes("true".ToCharArray());
ClientSock.Send(bta);
}
else
{
bta = System.Text.Encoding.Default.GetBytes("false".ToCharArray());
ClientSock.Send(bta);
}
}
//使用者退出
else if(sta.Substring(0,3)=="out")
{
string q = sta.Remove(0, 3);
Offline(q);
continue;
}
}
}
Thread.Sleep(200);
}