C#使用Socket局域网内推送消息学习
代码不是我的原创,东拼西凑的结合体,我只是敲了一边,学习学习。当A电脑开启监听端口时,B电脑输入A电脑的IP和端口可以像B电脑发送消息。
当然AB电脑在统一局域网内。
代码太多放最后了,这是项目
socket接收消息
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
Color c = Color.FromArgb(255, 0, 0);
this.pictureBox1.BackColor = c;
}
/// <summary>
/// 开启监听
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
this.Listen(int.Parse(textBox_port.Text));//端口
Color c = Color.FromArgb(0, 255, 0);
this.pictureBox1.BackColor = c;
}
#region 接收Socket
private static Encoding encode = Encoding.Default;
/// <summary>
/// 监听请求
/// </summary>
/// <param name="port">端口</param>
public void Listen(int port)
{
Task.Run(() =>
{
try
{
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(new IPEndPoint(IPAddress.Any, port));
listenSocket.Listen(100);
this.Logs_Info("开启监听" + port + "端口...");
while (true)
{
Socket acceptSocket = listenSocket.Accept();
string receiveData = Receive(acceptSocket, 5000);
if (receiveData == "1")//如果接收到的消息是1,窗口最小化
this.Minimized();
this.Logs_Info("Receive:" + receiveData);
acceptSocket.Send(encode.GetBytes("ok"));
DestroySocket(acceptSocket);
}
}
catch (Exception e)
{
throw;
}
});
}
/// <summary>
/// 窗口最小化
/// </summary>
private void Minimized()
{
Task.Run(() =>
{
this.WindowState = FormWindowState.Minimized;
});
}
//输出文本框
private void Logs_Info(string message)
{
try
{
if (textBox1.InvokeRequired)//跨线程了
textBox1.Invoke(new EventHandler(delegate
{
textBox1.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
}));
else//同线程直接赋值
textBox1.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
}
catch { }
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="socket"></param>
/// <param name="timeout"></param>
/// <returns></returns>
private string Receive(Socket socket, int timeout)
{
string result = string.Empty;
socket.ReceiveTimeout = timeout;
List<byte> data = new List<byte>();
byte[] buffer = new byte;
int length = 0;
try
{
while ((length = socket.Receive(buffer)) > 0)
{
for (int j = 0; j < length; j++)
{
data.Add(buffer);
}
if (length < buffer.Length)
{
break;
}
}
}
catch { }
if (data.Count > 0)
{
result = encode.GetString(data.ToArray(), 0, data.Count);
}
return result;
}
/// <summary>
/// 销毁Socket对象
/// </summary>
/// <param name="socket"></param>
private void DestroySocket(Socket socket)
{
if (socket.Connected)
{
socket.Shutdown(SocketShutdown.Both);
}
socket.Close();
}
socket发送消息
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 发送按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string IP=this.textBox_IP.Text;//ip
int port=int.Parse(this.textBox_端口.Text);//端口
string news=this.textBox1.Text;//发送消息内容
this.SendMessage(IP, port, news);
}
/// <summary>
/// 字符编码处理.
/// </summary>
private Encoding ASCII;
/// <summary>
/// 发送
/// </summary>
/// <param name="IP"></param>
/// <param name="port"></param>
/// <param name="news"></param>
public void SendMessage(string IP, int port, string news)
{
ASCII = Encoding.ASCII;
// 构造用于发送的 字节缓冲.
Byte[] sendBytes = ASCII.GetBytes(news);
// 构造用于接收的 字节缓冲.
Byte[] recvBytes = new Byte;
// IP地址.
IPAddress localAddr = IPAddress.Parse(IP);
// 接入点.
IPEndPoint ephost = new IPEndPoint(localAddr, port);
// 第一个参数:AddressFamily = 指定 Socket 类的实例可以使用的寻址方案。
// Unspecified 未指定地址族。
// InterNetwork IP 版本 4 的地址。
// InterNetworkV6 IP 版本 6 的地址。
//
// 第二个参数:SocketType = 指定 Socket 类的实例表示的套接字类型。
// Stream 一个套接字类型,支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。
// 此类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接。
// 此套接字类型使用传输控制协议 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6。
//
// 第三个参数:ProtocolType = 指定 Socket 类支持的协议。
// Tcp 传输控制协议 (TCP)。
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// 尝试连接主机.
s.Connect(ephost);
Logs_Info("向服务器发送到了:{0}".FormatWith(news));
// 向主机发送数据.
s.Send(sendBytes, sendBytes.Length, SocketFlags.None);
// 接收服务器的应答.
Int32 bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
StringBuilder buff = new StringBuilder();
while (bytes > 0)
{
// 将缓冲的字节数组,装换为字符串.
String str = ASCII.GetString(recvBytes, 0, bytes);
// 加入字符串缓存
buff.Append(str);
// 再次接受,看看后面还有没有数据.
bytes = s.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
}
Logs_Info("从服务器接收到了:{0}".FormatWith(buff.ToString()));
}
catch (Exception ex)
{
Logs_Info("连接/发送/接收过程中,发生了错误!");
Logs_Info(ex.Message);
Logs_Info(ex.StackTrace);
}
finally
{
s.Close();
}
}
/// <summary>
/// 输出消息
/// </summary>
/// <param name="message"></param>
private void Logs_Info(string message)
{
try
{
if (textBox2.InvokeRequired)
textBox2.Invoke(new EventHandler(delegate
{
textBox2.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
}));
else
textBox2.AppendText("{0}:{1}\r\n".FormatWith(DateTime.Now.ToString(), message));
}
catch { }
}
挺有意思的,帮顶 我以为,不用安装客户端都可以推送 linuxcool 发表于 2020-12-21 16:17
我以为,不用安装客户端都可以推送
那不就为所欲为了 linuxcool 发表于 2020-12-21 16:17
我以为,不用安装客户端都可以推送
要这么厉害就上天了 Java学员来看啦 学习下,正在研究这方面的 有意思,这样的好贴必须顶起。 liu8359 发表于 2020-12-21 16:19
那不就为所欲为了
对,其实有些人就是想为所欲为{:301_976:} 有时间学习下。。。感谢分享
页:
[1]
2