基于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基于 ...
 
随机推荐
- Py基础+中级
			
原文 Py学习博客 1:https://www.cnblogs.com/fu-yong/p/8060198.html2:while True:just do it 三.Python的默认编码 ▷pyt ...
 - js 根据固定位置获取经纬度--腾讯地图
			
1.首先引入jq 和 腾讯地图js <script src="../js/jQuery.js"></script> <script charset=& ...
 - Ruby. Vs . Python
			
前言:从语言的本质上来分析,我对Ruby持反对态度,毕竟语言是为了交流,在表达的效率层面为了正确性必须适当放弃复杂性.且有句老话说的好,Ruby In Rails 才是语言,而Ruby只是这个语言的工 ...
 - 【从零开始】【Java】【0】装软件些
			
闲聊 其实最先写的是1,所以拐回头写的只能是0了. 因为要在不同的电脑上搞这个东西,必然涉及到装机,当然只是装我们用的这些,且是最基础的部分了. 大晚上的睡不着觉,起来,大概1个小时全部搞定,随便记下 ...
 - salt-master迁移
			
1.在迁移到的目标机器上先安装salt-master 2.把原master机器上的/etc/salt/pki目录打包发送到迁移的机器上的同等目录下面 3.在原master机器上批量修改minion的配 ...
 - RabbitMQ学习之集群模式
			
由于RabbitMQ是用erlang开发的,RabbitMQ完全依赖Erlang的Cluster,因为erlang天生就是一门分布式语言,集群非常方便,但其本身并不支持负载均衡.Erlang的集群中各 ...
 - idea中git的运用
			
创建本地 Git 仓库 安装 Git 插件 将代码添加到 Git 的本地仓库 在 GitHub 中创建仓库
 - react实现简单倒计时
			
今天遇到一个简单的小功能,看网上的一些方法感觉不太适合,所以就手敲了一个,直接上代码!!! import React, { Component } from 'react'; class NoTime ...
 - alg--分治法
			
分治--分而治之, 把大的问题分成n个小的问题,分别处理,然后汇总小问题的结果. 具体介绍可以参考这位大哥的blog: https://www.cnblogs.com/steven_oyj/archi ...
 - RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第七篇【元素定位介绍】
			
http://blog.csdn.net/deadgrape/article/details/50628113 我想大家在玩自动化的时候最关心的一定是如何定位元素,因为元素定位不到后面的什么方法都实现 ...