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. 使用memcached遇到的一些问题

    1 .多台服务器时间不统一,引发缓存存取异常. 问题描述: 同一台memcache缓存服务器,比如memcache.server=192.168.88.51:11211   提供缓存服务: 项目部署到 ...

  2. pyhon的yileld的一点笔记

    yield感觉很神秘,感觉也不好理解,学习pyhon最后终归是要学习这个东西,研究了一段时间,把自己的笔记写下来 说简单点就是遇到yield就停止往下执行代码,也包括不执行yield这条语句,然后返回 ...

  3. 如何在Python中调用Matlab

    检查您的系统是否具有受支持的 Python 版本和 MATLAB R2014b 或更新版本.要检查您的系统上是否已安装 Python,请在操作系统提示符下运行 Python. 1)打开Prompt,输 ...

  4. 服务主机superFetch占用磁盘过多

    有用户升级到Win10系统后,发现系统运行不快,查看任务管理器中正在运行的进程,然后查看到有一个名称为“服务主机:本地系统(网络受限)”的进程的磁盘占用率很高.如果想要解决这个问题,那么不妨参考下面介 ...

  5. 爬虫之进阶 twisted

    简介 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库.Twi ...

  6. python day06笔记总结

    2019.4.3 S21 day06笔记总结 一.昨日内容补充 1.列表独有功能: 1.revers 反转 例:v1 = [1,2,4,88,2] v1.revers() print(v1) 2.so ...

  7. python之全局变量与局部变量

    全局变量: -   在书写中顶格开始: -   一旦定义完毕在整个文件生效: -   在函数内如果定义了同名全局变量名,会“覆盖”掉全局变量: -   在函数中同名的变量,当在函数退出后消失,全局的同 ...

  8. 网站改版应对google

    客户要求修改网站,这会给我们带来问题!为了保留他的网站权重和关键字排名,我们必须在做网站修改工作之前分析他原来网站的连接结构和标题,这样我才能更好地保证他原来网站的整体权重不会有大的变化!以下是我们根 ...

  9. 登录注册页面(连接MySQL8.0.15版本)

    原文链接:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483779&idx=1&sn=e23e68e96 ...

  10. 2018-2019-20175302实验二《Java面向对象程序设计》实验报告

    2018-2019-2 学号实验二<Java面向对象程序设计>实验报告 一.实验步骤及内容 1. 面向对象程序设计 参考 http://www.cnblogs.com/rocedu/p/6 ...