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. 【396】python 递归练习题(COMP9021)

    Merging two strings into a third one Say that two strings s1 and s2 can be merged into a third strin ...

  2. PostgreSQL在windows 10上的下载和安装

    一.下载 PostgreSQL Windows版本下载地址: https://www.postgresql.org/download/windows/ 下载地址包含2个版本,根据个人喜好下载即可: 1 ...

  3. 如何解决 快速点击多次触发的bug 期望快速点击只一次生效

    var lastClick; lockClick(){ var nowClick = new Date(); if (lastClick === undefined) { lastClick = no ...

  4. 1、let const

    1.作用域的概念 es6之前 es5 分为 全局作用域 函数作用域 es6 新增块级作用域 2.let const 与 var 区别 用var 可以无报错 此代码报错 引出 块级作用域 用 {} 包起 ...

  5. js----点击事件三种方法

    在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 (1)注意函数名没有双引号. ...

  6. 求1!+2!+3!+......+n!的和 -----C++-----

    #include<iostream> using namespace std; int function(int x) { ; ;i<=x;i++) sum=sum*i; retur ...

  7. ApplicationListener接口的生命周期

    create:游戏初次创建时被调用,一般在这里创建ApplicationListener对象,初始化布景信息,将数据或UI布局绑定到监听器等,执行完该方法后会执行resize方法,是游戏创建立即执行的 ...

  8. python第一周语言基础

    控制语句 if语句,当条件成立时运行语句块.经常与else, elif(相当于else if) 配合使用. for语句,遍历列表.字符串.字典.集合等迭代器,依次处理迭代器中的每个元素. while语 ...

  9. Java框架spring 学习笔记(十四):注解aop操作

    回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...

  10. mybatis动态sql之foreach标签

    foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量.它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符.这个元素是很 ...