C# Winform Soket 网络编程 多个客户端连接服务器并返回客户端操作请求
2017.8.2
服务器:
#region 参数与集合
/// <summary>
/// 客户端IP
/// </summary>
string clientIP;
/// <summary>
/// IP地址(IPAddress)
/// </summary>
string thisIp;
/// <summary>
/// 端口(Port)
/// </summary>
int port;
/// <summary>
/// Thread:监听客户端连接请求
/// </summary>
Thread watchClientThread = null;
/// <summary>
/// Socket:监听客户端连接请求
/// </summary>
Socket watchClientSocker = null;
/// <summary>
/// 套接字集合(Socket Gether)
/// </summary>
Dictionary<string, Socket> dictSocket = new Dictionary<string, Socket>();
/// <summary>
/// 线程集合(Thread Gether)
/// </summary>
Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();
#endregion #region 获取本地IP地址
/// <summary>
/// 获取本地IP地址
/// </summary>
private void GetIPAddress()
{
NetworkInterface[] nis = NetworkInterface.GetAllNetworkInterfaces();
if (nis.Length > )
{
for (int i = ; i < nis.Length; i++)
{
foreach (var item in nis[i].GetIPProperties().UnicastAddresses)
{
string s = item.Address.ToString();
string[] ss = s.Split('.');
if (ss.Length == )
{
if (ss[].ToString() != "" && ss[].ToString() == "")
{
thisIp = s;
break;
}
}
}
}
}
}
#endregion #region 启动服务器
/// <summary>
/// 启动服务器
/// </summary>
public void SocketStart()
{
GetIPAddress();
port = ;
watchClientSocker = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(thisIp), port);
try
{
watchClientSocker.Bind(endPoint);
}
catch (SocketException se)
{
rtbMonitoring.Text += "异常:" + se.Message + "\n";
return;
}
catch (Exception ex)
{
rtbMonitoring.Text += "异常:" + ex.Message + "\n";
}
watchClientSocker.Listen();
watchClientThread = new Thread(WatchConnection);
watchClientThread.IsBackground = true;
watchClientThread.Start();
}
#endregion #region 开始监听客户端连接请求
/// <summary>
/// 开始监听客户端连接请求
/// </summary>
void WatchConnection()
{
while (true)
{
Socket socketConn = watchClientSocker.Accept();
clientIP = socketConn.RemoteEndPoint.ToString();
dictSocket.Add(clientIP, socketConn);
Thread thr = new Thread(ReccptionData);
thr.IsBackground = true;
thr.Start(socketConn);
dictThread.Add(clientIP, thr);
rtbMonitoring.Text += clientIP + " 连接成功" + "\n";
}
}
#endregion #region 客户端信息处理
/// <summary>
/// 客户端信息处理
/// </summary>
/// <param name="socketConn"></param>
void ReccptionData(object socketConn)
{
Socket socketClient = socketConn as Socket;
while (true)
{
byte[] arrRec = new byte[ * * ];
int length = -;
try
{
length = socketClient.Receive(arrRec);
}
catch (SocketException se)
{
rtbMonitoring.Text += "异常:" + se.Message+"\n";
dictSocket.Remove(socketClient.RemoteEndPoint.ToString());
dictThread.Remove(socketClient.RemoteEndPoint.ToString());
break;
}
if (arrRec[] == )
{
clientIP = socketClient.RemoteEndPoint.ToString();
string strMsg = System.Text.Encoding.UTF8.GetString(arrRec, , length - );// 将接受到的字节数据转化成字符串;
ReturnData(strMsg);
rtbMonitoring.Text +=clientIP+":"+ strMsg + "\n";
}
if (arrRec[] == )
{
if (!Directory.Exists("FileInfo"))
{
Directory.CreateDirectory("FileInfo");
}
if (!File.Exists(arrRec + ".txt"))
{
File.Create(arrRec + ".txt");
}
string fileSavePath = arrRec + " .txt";
using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
{
fs.Write(arrRec, , length - );
rtbMonitoring.Text += "文件保存成功:" + fileSavePath + "\n"; }
}
} }
#endregion #region 返回请求数据
/// <summary>
/// 返回请求数据
/// </summary>
/// <param name="data"></param>
void ReturnData(string data)
{
string connectSql = "server=.;database=Thread_SocketDB;uid=sa;pwd=sa;";
string strMsg;
UserInfo u = new UserInfo();
GetSql getsql = new GetSql();
List<UserInfo> us = new List<UserInfo>();
string[] datas = data.Split('/');
string operationType = "";
string type = "";
string userName = "";
string pwd = "";
if (datas.Length > )
{
operationType = datas[];
type = datas[];
userName = datas[];
pwd = datas[];
}
switch (operationType)
{
case "用户":
switch (type)
{
case "登录":
SqlConnection con = new SqlConnection(connectSql);
con.Open();
SqlCommand com = new SqlCommand(getsql.GetSelectAll(), con);
SqlDataReader dr = com.ExecuteReader();
while (dr.Read())
{
u = new UserInfo();
u.UserName = dr["UserName"].ToString();
u.Pwd = dr["Pwd"].ToString();
us.Add(u);
}
dr.Close();
con.Close();
strMsg = "正在验证登录信息...";
SendContent(strMsg);
List<UserInfo> loginInfo = us.FindAll((p) =>
p.UserName == userName);
if (loginInfo.Count <= )
{
strMsg = "对不起,你的账号不存在!";
SendContent(strMsg); }
else
{
foreach (UserInfo userInfo in loginInfo)
{
u = userInfo;
} if (pwd != u.Pwd)
{ strMsg = "对不起,你的密码不正确!";
SendContent(strMsg); }
else
{
strMsg = "登录成功!";
SendContent(strMsg);
}
}
break;
case "编号查询": break;
}
break;
case "管理员": break;
}
}
#endregion #region 封装发送信息
/// <summary>
/// 封装发送信息
/// </summary>
/// <param name="strMsg"></param>
private void SendContent(string s)
{
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(s);
byte[] arrSendMsg = new byte[arrMsg.Length + ];
arrSendMsg[] = ; // 用来表示发送的是消息数据
Buffer.BlockCopy(arrMsg, , arrSendMsg, , arrMsg.Length);
dictSocket[clientIP].Send(arrSendMsg);
}
#endregion
客户端:
/// <summary>
/// 客户端套接字对象
/// </summary>
Socket sockClient = null;
/// <summary>
/// 客户端线程
/// </summary>
Thread threadCilent = null;
#region 开始连接字符串
/// <summary>
/// 开始连接字符串
/// </summary>
public void ServerConnect()
{
try
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.4.186"), );
sockClient = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try
{
lbReception.Text = "正在与服务器进行连接...\n";
sockClient.Connect(endPoint);
}
catch (SocketException se)
{
lbReception.Text = "异常:" + se.Message + "\n";
return;
}
lbReception.Text = "连接成功!";
threadCilent = new Thread(Res);
threadCilent.IsBackground = true;
threadCilent.Start(); }
catch (Exception)
{
lbReception.Text = "IP无效!";
throw;
} } #region 接收数据处理
/// <summary>
/// 接收数据处理
/// </summary>
private void Res()
{ while (true)
{
// 定义一个2M的缓存区;
byte[] arrMsgRec = new byte[ * * ];
// 将接受到的数据存入到输入 arrMsgRec中;
int length = -;
try
{
length = sockClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度;
}
catch (SocketException se)
{
lbReception.Text = "异常;" + se.Message;
return;
}
catch (Exception e)
{
lbReception.Text = "异常:" + e.Message;
return;
}
if (arrMsgRec[] == ) // 表示接收到的是消息数据;
{
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, , length - );// 将接受到的字节数据转化成字符串;
lbReception.Text = strMsg;
}
}
}
#endregion
#endregion #region 发送数据
/// <summary>
/// 发送数据
/// </summary>
/// <param name="s"></param>
public void send(string s)
{
try
{
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(s);
byte[] arrSendMsg = new byte[arrMsg.Length + ];
arrSendMsg[] = ; // 用来表示发送的是消息数据
Buffer.BlockCopy(arrMsg, , arrSendMsg, , arrMsg.Length);
sockClient.Send(arrSendMsg); // 发送消息;
}
catch (Exception)
{ throw;
} }
#endregion
C# Winform Soket 网络编程 多个客户端连接服务器并返回客户端操作请求的更多相关文章
- 《Python》网络编程之验证客户端连接的合法性、socketserver模块
一.socket的更多方法介绍 # 服务端套接字函数 s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接, ...
- Linux网络编程服务器模型选择之并发服务器(上)
与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...
- Android客户端连接服务器端,向服务器端发送请求HttpURLConnection
在Java中想后台服务器发送请求一般都直接使用了Java的网络编程,或者使用HttpClient向后台服务器端发送HTTP请求.虽然在安卓中,所有Java的API都可以使用,而却使用其并不会出现什么问 ...
- Mysql从客户端连接服务器连不上的问题
Mysql从客户端连接服务器连不上的问题 公司要用Mysql做一个测试,开始在自己的本地建一个Mysql数据库自己本地的程序再连上去,没有遇到过连接不上的问题.这次数据库在服务器上,从本地客户端连 ...
- C/S模式客户端连接服务器连接不上的问题
C/S模式客户端连接服务器连接不上的问题 1.服务器电脑防火墙关闭 2.服务器端SQL SERVER2008R: 配置工具--SQL SERVER配置管理器 MSSQLSERVER协议.客户端协议(S ...
- 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)
RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...
- Linux网络编程服务器模型选择之循环服务器
在网络程序里面,通常都是一个服务器处理多个客户机,为了出个多个客户机的请求,服务器端的程序有不同的处理方式.本节开始介绍Linux下套接字编程的服务器模型选择,主要包括循环服务器模型.并发服务器模型. ...
- 【TCP/IP网络编程】:04基于TCP的服务器端/客户端
摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...
- 【TCP/IP网络编程】:06基于UDP的服务器端/客户端
本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先 ...
随机推荐
- React State(状态)
function FormattedDate(props){ return ( <h1>现在是{props.date}</h1> ) } class Clock extends ...
- ios 信任charles https 证书
https://www.charlesproxy.com/documentation/using-charles/ssl-certificates/ https://support.apple.com ...
- pywin32安装教程
下载 pywin32-224-cp37-cp37m-win32.whl 放在 Scripts 目录下,然后cmd 安装 pip install pypiwin32 即可成功 此次安装成功对应的pyth ...
- 安装USB驱动时报错“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”
今天在安装一个USB设备的时候报错“Windows已找到设备的驱动程序软件,但在试图安装它时遇到错误”. 这个错误的描述是“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”. 事实上,这个 ...
- python day10 函数(第二篇)
2019.4.10 S21 day10笔记总结 一.内容回顾 1.面试题相关: 1.py2和py3的区别 2.运算符的计算 :3 or 9 and 8 3.字符串的反转 4.is和==的区别 5.v1 ...
- Ubuntu开机时提示“piix4_smbus 0000:00:07.3: SMBus Host controller not enabled”
问题描述:Ubuntu开机时提示“piix4_smbus 0000:00:07.3: SMBus Host controller not enabled” 版本:Ubuntu 18.04 VMw ...
- FOB注意事项
1. FOB是我们作为贸易公司去联系物流公司将货送到码头,缴纳FOB cost 以后,海关安排码头的人送到船上. 2.在这之前,买方自己订船,然后发给卖方入货通知,卖方安排发货. 3.FOB cost ...
- H-Modify Minieye杯第十五届华中科技大学程序设计邀请赛现场赛
题面见 https://ac.nowcoder.com/acm/contest/700#question 题目大意是有n个单词,有k条替换规则(单向替换),每个单词会有一个元音度(单词里元音的个数)和 ...
- Python开发【第九篇】:进程、线程
什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于,程序是指令的集合,它是进程运行的静态描述文本 ...
- 通信导论-IP数据网络基础(3)
ICMP(IP辅助协议)--网际控制报文协议 ICMP报文种类:ICMP差错报文(终点不可达.时间超过等5种)和ICMP询问报文(回送请求和回答请求.时间戳请求和回答报文2种) ICMP是一种集差错报 ...