页眉 private byte[] _receiveData = new byte[1024]; private string _username; private string _password; private bool _needPasswordl; private bool _passwordWrong; public TcpServerForm() {
InitializeComponent(); }
private void TcpReceiveForm_Load(object sender, EventArgs e) {
IPAddress[] addressList = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress ip in addressList) {
if (ip.ToString().Length <= 15)
lbNativeIP.Items.Insert(0, ip.ToString()); }
btnDisconnect.Enabled = false; }
private void btnListen_Click(object sender, EventArgs e) {
_username = txtUserName.Text;
_password = txtPassword.Text; //设置用户名与密码
_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//新建协议为tcp的socket
_server.Bind(new IPEndPoint(IPAddress.Any, 8000));//监听端口为8000 _server.Listen(5);//开始监听
_server.BeginAccept(new AsyncCallback(AcceptedConnection), _server);//异步调用,开始接收连接
this.lblStatus.Text = \开始监听...\;
9 / 22
页眉 btnListen.Enabled = false; txtUserName.Enabled = false; txtPassword.Enabled = false; _needPasswordl = true;
_passwordWrong = false;//处理逻辑 }
private void btnDisconnect_Click(object sender, EventArgs e) {
_client.Close(); _needPasswordl = true;
_server.BeginAccept(new AsyncCallback(AcceptedConnection), _server); this.lblStatus.Text = \开始监听...\; }
void AcceptedConnection(IAsyncResult iar) {
_client = ((Socket)iar.AsyncState).EndAccept(iar);//终止接收连接
this.lblStatus.Text = \连接到:\ + _client.RemoteEndPoint.ToString();//解析对方地址与端口 byte[] sendMessage = Encoding.Default.GetBytes(DateTime.Now.TimeOfDay + \请发送用户与密码\);//向客户端提出发送密码的请求
lbConnectLog.Items.Insert(0, \连接到:\ + _client.RemoteEndPoint.ToString()); _client.BeginSend(sendMessage, 0, sendMessage.Length, SocketFlags.None, new AsyncCallback(SentData), _client);//异步调用,消息发送完毕执行SentData btnDisconnect.Enabled = true; }
void ReceivedData(IAsyncResult iar) {
_client = (Socket)iar.AsyncState; int recv = 0; try {
10 / 22
页眉 recv = _client.EndReceive(iar); } catch {
ProcessDisconnection(); }//解析消息
if (recv == 0)//解析失败 {
_client.Close();
this.lblStatus.Text = \等待连接...\;
_server.BeginAccept(new AsyncCallback(AcceptedConnection), _server); return; }
string receiveMessage = Encoding.Default.GetString(_receiveData, 0, recv); this.lbMessage.Items.Insert(0,receiveMessage);//将消息放入消息列表 byte[] feedbackMessage; if(_needPasswordl) {
string receiveUsername = receiveMessage.Substring(receiveMessage.LastIndexOf(\) + 1, receiveMessage.IndexOf(\) - (receiveMessage.LastIndexOf(\) + 1));
string receivePassword = receiveMessage.Substring(receiveMessage.IndexOf(\) + 1, receiveMessage.Length - (receiveMessage.IndexOf(\) + 1)); if(receiveUsername == _username && receivePassword == _password) {
_needPasswordl = false; _passwordWrong = false;
feedbackMessage = Encoding.Default.GetBytes(DateTime.Now.TimeOfDay + \验证成功_\ + receiveMessage);
_client.BeginSend(feedbackMessage, 0, feedbackMessage.Length, SocketFlags.None, new AsyncCallback(SentData), _client);
11 / 22
页眉 return; } else {
this.lbConnectLog.Items.Insert(0, receiveUsername + \ + receivePassword + \验证失败\); feedbackMessage = Encoding.Default.GetBytes(DateTime.Now.TimeOfDay + \验证失败_\ + receiveMessage); _passwordWrong = true;
_client.BeginSend(feedbackMessage, 0, feedbackMessage.Length, SocketFlags.None, new AsyncCallback(SentData), _client); return; } }
feedbackMessage = Encoding.Default.GetBytes(DateTime.Now.TimeOfDay + \成功接收\ + receiveMessage);
_client.BeginSend(feedbackMessage, 0, feedbackMessage.Length, SocketFlags.None, new AsyncCallback(SentData), _client); }
void SentData(IAsyncResult iar) {
_client = (Socket)iar.AsyncState; int sent = _client.EndSend(iar); if (_passwordWrong) {
lbConnectLog.Items.Insert(0, \主动断开连接\ + _client.RemoteEndPoint.ToString()); _client.Close(); _needPasswordl = true;
_server.BeginAccept(new AsyncCallback(AcceptedConnection), _server);//重新开始接收新的连接
ProcessDisconnection();
12 / 22
相关推荐: