Socket通信问题,客户端连接服务端的时候,如何把用户名和密码也一起输过去。
客户端连接服务端的时候,把用户名和密码也一起传过去做一个登录验证,验证一下现在连接的用户是否存在.....但是 socke.Connect(endPoint);这样只是可以和服务器做一个链接,根本传不了用户名和密码过去。望高手指点。
2012-11-10 10:23
程序代码://FormServer.cs
using System;
using System.Collections.Generic;
using using using using System.Text;
using System.Windows.Forms;
namespace ServerClient
{
delegate void StringEventHandler (string value);
delegate void StringEventHandler2 (string value, string value2);
public partial class FormServer : Form
{
#region 只读全局字段
private readonly byte[] _buffer;
private readonly Dictionary<Socket, bool> _clientAllowFlags;
#endregion
#region 全局字段
private int _currentClientId;
private Socket _socketServer;
#endregion
#region 构造函数
public FormServer()
{
InitializeComponent();
_buffer = new byte[512];
_clientAllowFlags = new Dictionary<Socket, bool>();
Closing += FormServer_Closing;
}
#endregion
#region 控件事件
private void ButStart_Click(object sender, EventArgs e)
{
ButStart.Enabled = false;
_socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socketServer.Bind(new IPEndPoint(IPAddress.Any, (int)NudPort.Value));
_socketServer.Listen(10);
_socketServer.BeginAccept(ClientAcceptedCallback, null);
ShowInfo("Server is ready.");
ButStop.Enabled = true;
}
private void ButStop_Click(object sender, EventArgs e)
{
ButStop.Enabled = false;
_socketServer.Close();
ShowInfo("Server is stopped.");
ButStart.Enabled = true;
}
void FormServer_Closing(object sender, CancelEventArgs e)
{
if (_socketServer == null) return;
_socketServer.Close();
}
#endregion
#region Socket事件
private void ClientAcceptedCallback(IAsyncResult ar)
{
try
{
var clientSocket = _socketServer.EndAccept(ar);
_clientAllowFlags.Add(clientSocket, false);
clientSocket.Send(Encoding.Unicode.GetBytes(string.Concat("Give me your account:", _currentClientId)));
_currentClientId++;
ShowInfo(string.Concat("Client[",_currentClientId, "] connected. Wait for account information..."));
clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, clientSocket);
_socketServer.BeginAccept(ClientAcceptedCallback, null);
}
catch { }
}
private void ReceivedCallback(IAsyncResult ar)
{
var clientSocket = ar.AsyncState as Socket;
if (clientSocket == null) return;
try
{
var dataLength = clientSocket.EndReceive(ar);
var data = Encoding.Unicode.GetString(_buffer, 0, dataLength);
var elements = data.Split(':');
var command = elements[0];
switch (command)
{
case "Account":
{
var accountElements = elements[1].Split(',');
var userName = accountElements[0];
var password = accountElements[1];
//用你自己的验证逻辑替换这段
_clientAllowFlags[clientSocket] = userName == "UserName" && password == "Password";
//用你自己的验证逻辑替换这段
if (_clientAllowFlags[clientSocket])
{
clientSocket.Send(Encoding.Unicode.GetBytes("Okay"));
ShowInfo("Verified.");
}
else
{
clientSocket.Send(Encoding.Unicode.GetBytes("NoSuchAccount"));
_clientAllowFlags.Remove(clientSocket);
ShowInfo("No allow.");
}
}
break;
case "DC":
if (!_clientAllowFlags[clientSocket]) break;
ShowInfo(string.Concat("Client[", elements[1], "] disconnected."));
break;
case "Info":
if (!_clientAllowFlags[clientSocket]) break;
ShowInfo(elements[1], elements[2]);
break;
}
clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, clientSocket);
}
catch { }
}
#endregion
#region 私有方法
private void ShowInfo(string info)
{
if (InvokeRequired)
Invoke(new StringEventHandler(ShowInfo), new object[] {info});
else
{
TbState.AppendText(DateTime.Now.ToLongTimeString());
TbState.AppendText(":");
TbState.AppendText(info);
TbState.AppendText("\r\n");
}
}
private void ShowInfo(string clientID, string info)
{
if (InvokeRequired)
Invoke(new StringEventHandler2(ShowInfo), new object[] { clientID, info });
else
{
TbState.AppendText(DateTime.Now.ToLongTimeString());
TbState.AppendText(":");
TbState.AppendText(clientID);
TbState.AppendText(":");
TbState.AppendText(info);
TbState.AppendText("\r\n");
}
}
#endregion
}
}
//FormClient.cs
using System;
using using System.Text;
using System.Windows.Forms;
namespace ClientServer
{
internal delegate void IntegerEventHandler(int value);
delegate void StringEventHandler(string value);
public partial class FormClient : Form
{
#region 只读全局字段
private readonly byte[] _buffer;
#endregion
#region 全局字段
private Socket _clientSocket;
private int _id;
#endregion
#region 构造函数
public FormClient()
{
InitializeComponent();
_buffer = new byte[512];
}
#endregion
#region 控件事件
private void ButConnect_Click(object sender, EventArgs e)
{
ButConnect.Enabled = false;
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_clientSocket.Connect("localhost", (int)NudPort.Value);
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, null);
ShowInfo("Connected.");
ButDisconnect.Enabled = true;
}
private void ButDisconnect_Click(object sender, EventArgs e)
{
Disconnect();
}
private void ButSendCommand_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(TbCommand.Text)) return;
_clientSocket.Send(Encoding.Unicode.GetBytes(string.Concat("Info:", _id, ":", TbCommand.Text)));
}
#endregion
#region Socket事件
private void ReceivedCallback(IAsyncResult ar)
{
try
{
var dataLength = _clientSocket.EndReceive(ar);
var data = Encoding.Unicode.GetString(_buffer, 0, dataLength);
var elements = data.Split(':');
var command = elements[0];
switch (command)
{
case "Give me your account":
{
_id = int.Parse(elements[1]);
SetIDProcess();
//用需要验证的用户名和密码替换这句里面的UserName和Password
_clientSocket.Send(Encoding.Unicode.GetBytes(string.Concat("Account:", "UserName,", "Password")));
}
break;
case "NoSuchAccount":
ShowInfo("Verify failure!");
Disconnect();
break;
case "Okay":
ShowInfo("Ready.");
break;
case "Info":
ShowInfo(elements[1]);
break;
}
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, null);
}
catch { }
}
#endregion
#region 私有方法
private void Disconnect()
{
if (InvokeRequired)
Invoke(new MethodInvoker(Disconnect));
else
{
ButDisconnect.Enabled = false;
_clientSocket.Send(Encoding.Unicode.GetBytes(string.Concat("DC:", _id)));
_clientSocket.Close();
ShowInfo("Disconnected");
ButConnect.Enabled = true;
}
}
private void SetIDProcess()
{
if (InvokeRequired)
Invoke(new MethodInvoker(SetIDProcess));
else
{
Text = string.Concat("Client [", _id, "] by ");
ShowInfo(string.Concat("My ID is ", _id));
}
}
private void ShowInfo(string info)
{
if (InvokeRequired)
Invoke(new StringEventHandler(ShowInfo), new object[] { info });
else
{
TbState.AppendText(DateTime.Now.ToLongTimeString());
TbState.AppendText(":");
TbState.AppendText(info);
TbState.AppendText("\r\n");
}
}
#endregion
}
}
//FormServer.Designer.cs
namespace ServerClient
{
partial class FormServer
{
private components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null)) components.Dispose();
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.ButStart = new System.Windows.Forms.Button();
this.ButStop = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.TbState = new System.Windows.Forms.TextBox();
this.NudPort = new System.Windows.Forms.NumericUpDown();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.groupBox1.SuspendLayout();
(()(this.NudPort)).BeginInit();
this.groupBox2.SuspendLayout();
this.SuspendLayout();
this.ButStart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.ButStart.Location = new System.Drawing.Point(108, 25);
this.ButStart.Name = "ButStart";
this.ButStart.Size = new System.Drawing.Size(117, 23);
this.ButStart.TabIndex = 0;
this.ButStart.Text = "启动(&S)";
this.ButStart.UseVisualStyleBackColor = true;
this.ButStart.Click += new System.EventHandler(this.ButStart_Click);
this.ButStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Right)));
this.ButStop.Enabled = false;
this.ButStop.Location = new System.Drawing.Point(231, 25);
this.ButStop.Name = "ButStop";
this.ButStop.Size = new System.Drawing.Size(94, 23);
this.ButStop.TabIndex = 1;
this.ButStop.Text = "停止(&T)";
this.ButStop.UseVisualStyleBackColor = true;
this.ButStop.Click += new System.EventHandler(this.ButStop_Click);
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles) ((((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) |
System.Windows.Forms.AnchorStyles.Right)));
this.groupBox1.Controls.Add(this.TbState);
this.groupBox1.Location = new System.Drawing.Point(12, 61);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(316, 102);
this.groupBox1.TabIndex = 4;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "状态";
this.TbState.Dock = System.Windows.Forms.DockStyle.Fill;
this.TbState.Location = new System.Drawing.Point(3, 17);
this.TbState.MaxLength = 3276700;
this.TbState.Multiline = true;
this.TbState.Name = "TbState";
this.TbState.ReadOnly = true;
this.TbState.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.TbState.Size = new System.Drawing.Size(310, 82);
this.TbState.TabIndex = 3;
this.NudPort.Location = new System.Drawing.Point(7, 16);
this.NudPort.Maximum = new decimal(new int[] { 65535, 0, 0, 0 });
this.NudPort.Minimum = new decimal(new int[] { 100, 0, 0, 0 });
this.NudPort.Name = "NudPort";
this.NudPort.Size = new System.Drawing.Size(67, 21);
this.NudPort.TabIndex = 6;
this.NudPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.NudPort.Value = new decimal(new int[] { 3636, 0, 0, 0 });
this.groupBox2.Controls.Add(this.NudPort);
this.groupBox2.Location = new System.Drawing.Point(12, 12);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(81, 43);
this.groupBox2.TabIndex = 7;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "端口号";
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(340, 175);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.ButStop);
this.Controls.Add(this.ButStart);
this.Name = "FormServer";
this.ShowIcon = false;
this.Text = "Server by ";
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
(()(this.NudPort)).EndInit();
this.groupBox2.ResumeLayout(false);
this.ResumeLayout(false);
}
private System.Windows.Forms.Button ButStart;
private System.Windows.Forms.Button ButStop;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox TbState;
private System.Windows.Forms.NumericUpDown NudPort;
private System.Windows.Forms.GroupBox groupBox2;
}
}
//FormClient.Designer.cs
namespace ClientServer
{
partial class FormClient
{
private components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null)) components.Dispose();
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.ButConnect = new System.Windows.Forms.Button();
this.ButDisconnect = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.TbState = new System.Windows.Forms.TextBox();
this.TbCommand = new System.Windows.Forms.TextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.ButSendCommand = new System.Windows.Forms.Button();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.NudPort = new System.Windows.Forms.NumericUpDown();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
(()(this.NudPort)).BeginInit();
this.SuspendLayout();
this.ButConnect.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.ButConnect.Location = new System.Drawing.Point(109, 25);
this.ButConnect.Name = "ButConnect";
this.ButConnect.Size = new System.Drawing.Size(121, 23);
this.ButConnect.TabIndex = 1;
this.ButConnect.Text = "连接服务器(&C)";
this.ButConnect.UseVisualStyleBackColor = true;
this.ButConnect.Click += new System.EventHandler(this.ButConnect_Click);
this.ButDisconnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Right)));
this.ButDisconnect.Enabled = false;
this.ButDisconnect.Location = new System.Drawing.Point(236, 25);
this.ButDisconnect.Name = "ButDisconnect";
this.ButDisconnect.Size = new System.Drawing.Size(92, 23);
this.ButDisconnect.TabIndex = 2;
this.ButDisconnect.Text = "断开连接(&D)";
this.ButDisconnect.UseVisualStyleBackColor = true;
this.ButDisconnect.Click += new System.EventHandler(this.ButDisconnect_Click);
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) |
System.Windows.Forms.AnchorStyles.Right)));
this.groupBox1.Controls.Add(this.TbState);
this.groupBox1.Location = new System.Drawing.Point(12, 122);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(316, 125);
this.groupBox1.TabIndex = 3;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "状态";
this.TbState.Dock = System.Windows.Forms.DockStyle.Fill;
this.TbState.Location = new System.Drawing.Point(3, 17);
this.TbState.MaxLength = 3276700;
this.TbState.Multiline = true;
this.TbState.Name = "TbState";
this.TbState.ReadOnly = true;
this.TbState.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.TbState.Size = new System.Drawing.Size(310, 105);
this.TbState.TabIndex = 3;
this.TbCommand.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.TbCommand.Location = new System.Drawing.Point(6, 20);
this.TbCommand.Name = "TbCommand";
this.TbCommand.Size = new System.Drawing.Size(228, 21);
this.TbCommand.TabIndex = 5;
this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.groupBox2.Controls.Add(this.ButSendCommand);
this.groupBox2.Controls.Add(this.TbCommand);
this.groupBox2.Location = new System.Drawing.Point(12, 61);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(316, 55);
this.groupBox2.TabIndex = 6;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "命令";
this.ButSendCommand.Location = new System.Drawing.Point(240, 18);
this.ButSendCommand.Name = "ButSendCommand";
this.ButSendCommand.Size = new System.Drawing.Size(70, 23);
this.ButSendCommand.TabIndex = 6;
this.ButSendCommand.Text = "发送(&S)";
this.ButSendCommand.UseVisualStyleBackColor = true;
this.ButSendCommand.Click += new System.EventHandler(this.ButSendCommand_Click);
this.groupBox3.Controls.Add(this.NudPort);
this.groupBox3.Location = new System.Drawing.Point(12, 12);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(91, 43);
this.groupBox3.TabIndex = 8;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "服务器端口号";
this.NudPort.Location = new System.Drawing.Point(7, 16);
this.NudPort.Maximum = new decimal(new int[] { 65535, 0, 0, 0});
this.NudPort.Minimum = new decimal(new int[] { 100, 0, 0, 0});
this.NudPort.Name = "NudPort";
this.NudPort.Size = new System.Drawing.Size(78, 21);
this.NudPort.TabIndex = 6;
this.NudPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.NudPort.Value = new decimal(new int[] {3636, 0, 0, 0});
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(340, 259);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.ButDisconnect);
this.Controls.Add(this.ButConnect);
this.Name = "FormClient";
this.ShowIcon = false;
this.Text = "Client by ";
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox3.ResumeLayout(false);
(()(this.NudPort)).EndInit();
this.ResumeLayout(false);
}
private System.Windows.Forms.Button ButConnect;
private System.Windows.Forms.Button ButDisconnect;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox TbCommand;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button ButSendCommand;
private System.Windows.Forms.TextBox TbState;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.NumericUpDown NudPort;
}
}
2012-11-10 17:28