嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
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;
}
}
}