基于Socket的Winform例子
一、直接上效果图

二、Socket握手

三、服务端
Thread threadWatch = null;// 负责监听客户端的线程
Socket socketWatch = null;// 负责监听客户端的套接字
Socket clientConnection = null;// 负责和客户端通信的套接字
private void btn_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(ipAddress.Text.ToString()))
{
MessageBox.Show("监听ip地址不能为空!");
return;
}
if (string.IsNullOrEmpty(port.Text.ToString()))
{
MessageBox.Show("监听端口不能为空!");
return;
}
// 定义一个套接字用于监听客户端发来的消息,包含三个参数(ipv4寻址协议,流式连接,tcp协议)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 服务端发送消息需要一个ip地址和端口号
IPAddress ip = IPAddress.Parse(ipAddress.Text.Trim());
// 把ip地址和端口号绑定在网路节点endport上
IPEndPoint endPort = new IPEndPoint(ip, int.Parse(port.Text.Trim())); // 监听绑定的网路节点
socketWatch.Bind(endPort);
// 将套接字的监听队列长度设置限制为0,0表示无限
socketWatch.Listen(0);
// 创建一个监听线程
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
threadWatch.Start();
chatContent.AppendText("成功启动监听!ip:"+ip+",端口:"+port.Text.Trim()+"\r\n"); } /// <summary>
/// 监听客户端发来的请求
/// </summary>
private void WatchConnecting()
{
//持续不断监听客户端发来的请求
while (true)
{
clientConnection = socketWatch.Accept();
chatContent.AppendText("客户端连接成功!"+"\r\n");
// 创建一个通信线程
ParameterizedThreadStart pts = new ParameterizedThreadStart(acceptMsg);
Thread thr = new Thread(pts);
thr.IsBackground = true;
thr.Start(clientConnection);
}
} /// <summary>
/// 接收客户端发来的消息
/// </summary>
/// <param name="socket">客户端套接字对象</param>
private void acceptMsg(object socket)
{
Socket socketServer = socket as Socket;
while (true)
{
//创建一个内存缓冲区 其大小为1024*1024字节 即1M
byte[] recMsg = new byte[1024 * 1024];
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
int length = socketServer.Receive(recMsg);
//将机器接受到的字节数组转换为人可以读懂的字符串
string msg = Encoding.UTF8.GetString(recMsg,0,length);
chatContent.AppendText("客户端("+GetCurrentTime()+"):"+msg+"\r\n");
}
}
/// <summary>
/// 发送消息到客户端
/// </summary>
/// <param name="msg"></param>
private void serverSendMsg(string msg)
{
byte[] sendMsg = Encoding.UTF8.GetBytes(msg);
clientConnection.Send(sendMsg);
chatContent.AppendText("服务端("+GetCurrentTime()+"):"+msg+"\r\n");
} /// <summary>
/// 获取当前系统时间的方法
/// </summary>
/// <returns>当前时间</returns>
private DateTime GetCurrentTime()
{
DateTime currentTime = new DateTime();
currentTime = DateTime.Now;
return currentTime;
}
四、客户端
// 创建一个客户端套接字
Socket clientSocket = null;
// 创建一个监听服务端的线程
Thread threadServer = null;
private void btn_Click(object sender, EventArgs e)
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
if (string.IsNullOrEmpty(ipAddress.Text.ToString()))
{
MessageBox.Show("监听ip地址不能为空!");
return;
}
if (string.IsNullOrEmpty(port.Text.ToString()))
{
MessageBox.Show("监听端口不能为空!");
return;
}
IPAddress ip = IPAddress.Parse(ipAddress.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(ip, int.Parse(port.Text.Trim())); try
{ //这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind
clientSocket.Connect(endpoint);
}
catch
{
chatContent.AppendText("连接失败!"); } // 创建一个线程监听服务端发来的消息
threadServer = new Thread(recMsg);
threadServer.IsBackground = true;
threadServer.Start();
} /// <summary>
/// 接收服务端发来的消息
/// </summary>
private void recMsg() { while (true) //持续监听服务端发来的消息
{
//定义一个1M的内存缓冲区 用于临时性存储接收到的信息
byte[] arrRecMsg = new byte[1024 * 1024];
int length = 0;
try
{
//将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度
length = clientSocket.Receive(arrRecMsg);
}
catch
{
return; } //将套接字获取到的字节数组转换为人可以看懂的字符串
string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length);
//将发送的信息追加到聊天内容文本框中
chatContent.AppendText("服务端(" + GetCurrentTime() + "):" + strRecMsg + "\r\n");
}
} /// <summary>
/// 发送消息到服务端
/// </summary>
/// <param name="msg"></param>
private void clientSendMsg(string msg)
{
byte[] sendMsg = Encoding.UTF8.GetBytes(msg);
clientSocket.Send(sendMsg);
chatContent.AppendText("客户端(" + GetCurrentTime() + "):" + msg + "\r\n");
}
/// <summary>
/// 获取当前系统时间的方法
/// </summary>
/// <returns>当前时间</returns>
private DateTime GetCurrentTime()
{
DateTime currentTime = new DateTime();
currentTime = DateTime.Now;
return currentTime;
}
GitHub源码地址:https://github.com/51042309/Socket
基于Socket的Winform例子的更多相关文章
- C#基于Socket的CS模式的完整例子
基于Socket服务器端实现本例主要是建立多客户端与服务器之间的数据传输,首先设计服务器.打开VS2008,在D:\C#\ch17目录下建立名为SocketServer的Windows应用程序.打开工 ...
- Android 基于Socket的聊天应用(二)
很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...
- 基于socket.io的实时在线选座系统
基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...
- 基于BindingSource的WinForm开发
BindingSource控件介绍 BindingSource控件介绍 BindingSource控件是.NET Framework 2.0提供的新控件之一.BindingSource控件与数据源建立 ...
- 总结开发中基于DevExpress的Winform界面效果
DevExpress是一家全球知名的控件开发公司, DevExpress 也特指此公司出品的控件集合或某系列控件或其中某控件.我们应用最为广泛的是基于Winform的DevExpress控件组,本篇随 ...
- 基于DevExpress的Winform程序安装包的制作
在我们做系统开发的时候,都会面临一个安装包制作的问题,如何把我们做好的系统,通过安装包工具整合成一个安装包给客户进行安装.安装包的优势就是一步步安装就可以了,不用复制一大堆文件给客户,还怕缺少那个文件 ...
- 基于Socket客户端局域网或广域网内共享同一短信猫收发短信的开发解决方案
可使同一网络(局域网或广域网)内众多客户端,共享一个短信猫设备短信服务器进行短信收发,短信服务器具备对客户端的管理功能. 下面是某市建设银行采用本短信二次开发平台时实施的系统方案图: 在该方案中,考虑 ...
- C#基于Socket的简单聊天室实践
序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...
- memcached基于socket访问memcache缓存服务器
memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: .memcache基于php_memcache.dll扩展(php扩展) .memcached基于 ...
随机推荐
- Java数组操作工具
原文地址:http://blog.csdn.net/qq446282412/article/details/8913690 2013-05-11 10:27 看到网上的一段关于对数组操作的代码,觉 ...
- Python操作Oracle
[root@oracle02 pythonsoftware]# rpm -ivh oracle-instantclient-basic-11.1.0.1-1.x86_64.rpm Preparing. ...
- SaltStact自动化运维工具02
Grains基础:• Grains是saltstack最重要的组件之一• 存储minion端的基本信息,这些信息一般都是静态的,如CPU.内核.操作系统等• Grains存储在minion本地• 管 ...
- vc++如何创建程序-析构函数01
#include<iostream.h>class Point{public: int x; int y; Point() { x=0; y=0; }//构造函数是用来创建函数本身,那么, ...
- day27-3 matplatlib模块
目录 matplotlib 条形图 折线图 散点图 matplotlib 图形可视化,主要用来画图 别问,问就是看不懂 条形图 import matplotlib.pyplot as plt # 只识 ...
- linux 性能分析与优化
一.影响Linux服务器性能的因素 1.操作系统级 (CPU 内存 磁盘I/O性能 网络带宽) 2.程序应用级 二.系统性能评估标准 好 坏 极差 cpu user% +sys% <70% ...
- THUWC2019 划水记
Day -2 在学校呆了inf天之后终于回家了! Day 0 在家无(tui)所(fei)事(mo)事(yu),顺便被拉出去剪了个头发,想写写thusc2017的题也写不动,一直在网上冲浪,到处乱翻以 ...
- 主题:实战WebService II: SOAP篇(基于php)
概述(SOAP和XML-PRC比较) 在Web服务发展的初期,XML格式化消息的第一个主要用途是,应用于XML-RPC协议,其中RPC代表远程过程调用.在XML远程过程调用 (XML-RPC)中,客户 ...
- 【JavaScript框架封装】实现一个类似于JQuery的CSS样式框架的封装
// CSS 样式框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法)[只要是需要使用到this获取到的元素集合这个变量的时候, ...
- UVA1586 - Molar mass(紫书习题3.2)
HJL是一个从不讽刺人的品学兼优的好孩子,她最近沉迷学习化学而不能自拔.然而计算一个分子的相对分子质量使她烦不胜烦,因此她决定请你写一个程序来帮助她计算这种麻烦的事情. 已知: ①C代表的碳元素的相对 ...