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 网络编程 多个客户端连接服务器并返回客户端操作请求的更多相关文章

  1. 《Python》网络编程之验证客户端连接的合法性、socketserver模块

    一.socket的更多方法介绍 # 服务端套接字函数 s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接, ...

  2. Linux网络编程服务器模型选择之并发服务器(上)

    与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...

  3. Android客户端连接服务器端,向服务器端发送请求HttpURLConnection

    在Java中想后台服务器发送请求一般都直接使用了Java的网络编程,或者使用HttpClient向后台服务器端发送HTTP请求.虽然在安卓中,所有Java的API都可以使用,而却使用其并不会出现什么问 ...

  4. Mysql从客户端连接服务器连不上的问题

    Mysql从客户端连接服务器连不上的问题   公司要用Mysql做一个测试,开始在自己的本地建一个Mysql数据库自己本地的程序再连上去,没有遇到过连接不上的问题.这次数据库在服务器上,从本地客户端连 ...

  5. C/S模式客户端连接服务器连接不上的问题

    C/S模式客户端连接服务器连接不上的问题 1.服务器电脑防火墙关闭 2.服务器端SQL SERVER2008R: 配置工具--SQL SERVER配置管理器 MSSQLSERVER协议.客户端协议(S ...

  6. 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)

    RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...

  7. Linux网络编程服务器模型选择之循环服务器

    在网络程序里面,通常都是一个服务器处理多个客户机,为了出个多个客户机的请求,服务器端的程序有不同的处理方式.本节开始介绍Linux下套接字编程的服务器模型选择,主要包括循环服务器模型.并发服务器模型. ...

  8. 【TCP/IP网络编程】:04基于TCP的服务器端/客户端

    摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...

  9. 【TCP/IP网络编程】:06基于UDP的服务器端/客户端

    本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先 ...

随机推荐

  1. django APPEND_SLASH

    #设置项是否开启URL访问地址后面不为/跳转至带有/的路径APPEND_SLASH=True

  2. 性能学习随笔(1)--负载均衡之f5负载均衡

    负载均衡设计涉及软件负载和硬件负载,下文转自CSDN中一篇文章涉及f5硬负载知识 ----转载:https://blog.csdn.net/tvk872/article/details/8063489 ...

  3. 45_redux_comment应用_redux版本_异步功能

    /* * 包含所有action的type名称常量 * */ //添加评论 export const ADD_COMMENT = 'add_comment'; //删除评论 export const D ...

  4. spark总结

    算子总结 1.变换操作,包括过滤,变换,去重,排序,分区操作 filter过滤操作,无法触发重新分区 map,flatMap,flatMapValues,mapValues,mapPartitions ...

  5. 排序算法(Gif动图演示)

    冒牌排序(BubbleSort) 冒泡排序是一种比较简单的排序算法,它循环走过需要排序的元素,依次比较相邻的两个元素,如果顺序错误就交换,直至没有元素交换,完成排序. 若对n个人进行排序,我们需要n- ...

  6. keil的自动补全功能

    设置完之后,在.c文件上试一下,发现还是不能自动补全. 后来去各种贴吧里找到了答案,是我的.c文件还没有保存到工程文件中去,所以不能实现这个功能.

  7. P61 实践作业

    网络攻防实验环境搭建 根据链接下载的实验工具包,将其解压 打开VM虚拟机,点击图中红色框,扫描虚拟机 选择文件所在位置 点击下一步,完成.即可 在VM虚拟机设置中把网络适配器修改为桥接模式.如下图 在 ...

  8. C++读取与保持图片

    #include<iostream> using namespace std; void main(void) { //保存输入图像文件名和输出图像文件名 ]; ]; //图像数据长度 i ...

  9. 微信小程序生成携带参数的小程序码

    https://blog.csdn.net/qq_28988969/article/details/77969365

  10. Windows内核开发之串口过滤

    学习了几个月的内核编程,现在对Windows驱动开发又了更加深入的认识,特别是对IRP的分层处理逻辑有了深入认识. 总结起来就几句话: 当irp下来的时候,你要根据实际情况,进行处理 1> 无处 ...