实例介绍
【实例简介】
1、SocketSever服务器端代码
2、SocketClient客户端代码
3、VS2019上测试通过,修改IP地址和端口号就可以直接编译使用
【实例截图】
1、文件目录:
2、服务器端界面:
3、客户端界面:
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace SocketDemo.Server
{
public partial class FrmSocketServerMain : Form
{
public FrmSocketServerMain()
{
InitializeComponent();
}
bool normalflag = true;
//创建一个和客户端通信的套接字
static Socket SocketWatch = null;
//定义一个集合,存储客户端信息
static Dictionary<string, Socket> ClientConnectionItems = new Dictionary<string, Socket> { };
//端口号(用来监听的)
int port = 6000;
string host = "192.168.0.23";
private void btnStart_Click(object sender, EventArgs e)
{
IPAddress ip = IPAddress.Parse(host);
//IPAddress ip = IPAddress.Any;
//将IP地址和端口号绑定到网络节点point上
IPEndPoint ipe = new IPEndPoint(ip, port);
//定义一个套接字用于监听客户端发来的消息,包含三个参数(IP4寻址协议,流式连接,Tcp协议)
SocketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//监听绑定的网络节点
SocketWatch.Bind(ipe);
//将套接字的监听队列长度限制为20
SocketWatch.Listen(20);
//负责监听客户端的线程:创建一个监听线程
Thread threadwatch = new Thread(WatchConnecting);
//将窗体线程设置为与后台同步,随着主线程结束而结束
threadwatch.IsBackground = true;
//启动线程
threadwatch.Start();
listBox1.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff") " " "开启监听......");
}
//监听客户端发来的请求
void WatchConnecting()
{
Socket connection = null;
//持续不断监听客户端发来的请求
while (true)
{
try
{
connection = SocketWatch.Accept();
}
catch (Exception ex)
{
//提示套接字监听异常
listBox1.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff") " " "监听异常:" ex.Message);
break;
}
//客户端网络结点号
string remoteEndPoint = connection.RemoteEndPoint.ToString();
//添加客户端信息
ClientConnectionItems.Add(remoteEndPoint, connection);
//显示与客户端连接情况
listBox1.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff") " " "客户端" remoteEndPoint "建立连接成功! 客户端数量:" ClientConnectionItems.Count );
//获取客户端的IP和端口号
IPAddress clientIP = (connection.RemoteEndPoint as IPEndPoint).Address;
int clientPort = (connection.RemoteEndPoint as IPEndPoint).Port;
//让客户显示"连接成功的"的信息
string sendmsg = "本地IP:" clientIP " 本地端口:" clientPort.ToString() " 连接服务端成功!";
byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendmsg);
connection.Send(arrSendMsg);
//创建一个通信线程
Thread thread = new Thread(recv);
//设置为后台线程,随着主线程退出而退出
thread.IsBackground = true;
//启动线程
thread.Start(connection);
}
}
/// <summary>
/// 接收客户端发来的信息,客户端套接字对象
/// </summary>
/// <param name="socketclientpara"></param>
void recv(object socketclientpara)
{
Socket socketServer = socketclientpara as Socket;
while (true)
{
//创建一个内存缓冲区,其大小为1024*1024字节 即1M
byte[] arrServerRecMsg = new byte[1024 * 1024];
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
try
{
int length = socketServer.Receive(arrServerRecMsg);
//将机器接受到的字节数组转换为人可以读懂的字符串
string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
//将发送的字符串信息附加到文本框txtMsg上
listBox1.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff") " " "客户端" socketServer.RemoteEndPoint " ==> " strSRecMsg);
//Thread.Sleep(3000);
//发送客户端数据
if (ClientConnectionItems.Count > 0)
{
foreach (var socketTemp in ClientConnectionItems)
{
socketTemp.Value.Send(Encoding.UTF8.GetBytes("[" socketServer.RemoteEndPoint "]:" strSRecMsg));
}
}
}
catch (Exception)
{
ClientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString());
//提示套接字监听异常
listBox1.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff") " " "客户端" socketServer.RemoteEndPoint "已经中断连接! 客户端数量:" ClientConnectionItems.Count );
//关闭之前accept出来的和客户端进行通信的套接字
socketServer.Close();
break;
}
}
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void FrmSocketServerMain_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
this.btnClose.Enabled = false;
}
private void FrmSocketServerMain_FormClosing(object sender, FormClosingEventArgs e)
{
string MsgTxt = "您确定退出 Socket Server 吗?";
DialogResult RSS = MessageBox.Show(MsgTxt, "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (RSS == DialogResult.Yes)
{
if (SocketWatch != null)
SocketWatch.Close();
e.Cancel = false;
}
else
e.Cancel = true;
}
//禁用窗体的关闭按钮
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
get
{
CreateParams myCp = base.CreateParams;
myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON;
return myCp;
}
}
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (normalflag == true)
{
this.normalflag = false;
this.Hide();
this.WindowState = FormWindowState.Minimized;
}
else
{
this.normalflag = true;
this.Show();
this.WindowState = FormWindowState.Normal;
}
}
}
private void FrmSocketServerMain_Deactivate(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
this.Visible = false;
}
private void txtAuthPassword_KeyUp(object sender, KeyEventArgs e)
{
if (this.txtAuthPassword.Text == "13662677136")
this.btnClose.Enabled = true;
else
this.btnClose.Enabled = false;
}
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论