socket辅助类
using System;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading; namespace PYC.FileTransfer.Common.SocketHelp000000000000000000000
{
public delegate void NetSockErr(object sender, NetArgs e);
public delegate void NetConnect(object sender, NetArgs e);
public delegate void NetReceiveMsg(object sender, NetArgs e);
public delegate void NetDisConnect(object sender, NetArgs e); public class TCPSockClient : TCPSock
{
public event NetSockErr OnSockErr;
public event NetConnect OnConnect;
public event NetReceiveMsg OnReceiveMsg;
public event NetDisConnect OnDisConnect;
private bool online = false;
public Socket ClientSocket;//客户端网络连接
private Thread ThreadClientReceive;//客户端接收聊天信息线程
private int _ServerPort;
private IPAddress _ServerIP;
private byte[] data = new byte[1024];
private int sent;
public int ServerPort
{
get { return _ServerPort; }
}
public IPAddress ServerIP
{
get { return _ServerIP; }
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="p">服务端端口</param>
/// <param name="ip">服务端IP</param>
/// <param name="f">form</param>
/// <param name="neh">委托</param>
public TCPSockClient(string ip, int port)
{
_ServerPort = port;
_ServerIP = IPAddress.Parse(ip);
} public void Connect(string name)
{
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remoteEP = new IPEndPoint(_ServerIP, _ServerPort);//建立客户端网络端点
try
{
ClientSocket.Connect(remoteEP);
}
catch (SocketException e)
{
if (OnSockErr != null)
{
args.Msg = "连接远程服务器失败:" + e.Message;
OnSockErr(this, args);
}
return;
}
this_Connect(name);
Thread.Sleep(200);
ThreadClientReceive = new Thread(new ThreadStart(ClientReceive));
ThreadClientReceive.IsBackground = true;
ThreadClientReceive.Start();
} private void this_Connect(string name)
{
Send("Online|" + name);
if (OnConnect != null)
{
NetArgs na = new NetArgs(name);
OnConnect(this, na);
}
} private void ClientReceive()//客户端开始接收信息
{
online = true;
try
{
while (online)
{
if (ClientSocket == null || ClientSocket.Available < 1)
{
Thread.Sleep(200);
continue;
}
data = PreVarReceive(ClientSocket);
string msg = Encoding.Default.GetString(data);
if (msg != "")
{
string[] arr = msg.Split('|');
switch (arr[0])
{
case "Exit":
DisConnect();
return;
break;
default:
if (OnReceiveMsg != null)
{
NetArgs na = new NetArgs(msg);
OnReceiveMsg(this, na);
}
break;
}
}
Thread.Sleep(200);
}
}
catch (Exception e)
{
if (OnSockErr != null)
{
args.Msg = "客户端接收信息失败:" + e.Message;
OnSockErr(this, args);
}
}
} public void Send(string msg)
{
try
{
sent = PreVarSend(ClientSocket, Encoding.Default.GetBytes(msg));
}
catch (Exception e)
{
if (OnSockErr != null)
{
args.Msg = "客户端发送信息失败:" + e.Message;
OnSockErr(this, args);
}
}
} public void DisConnect()
{
Send("Exit");
Thread.Sleep(200);
online = false;
if (ClientSocket.Connected)
{
ClientSocket.Shutdown(SocketShutdown.Both);
}
ClientSocket.Close();
Thread.Sleep(200);
if (ThreadClientReceive.IsAlive)
{
ThreadClientReceive.Abort();
}
if (OnDisConnect != null)
{
NetArgs na = new NetArgs("");
OnDisConnect(this, na);
}
}
} public class TCPSockServer : TCPSock
{
public event NetSockErr OnSockErr;
public event NetConnect OnConnect;
public event NetReceiveMsg OnReceiveMsg;
public event NetDisConnect OnDisConnect;
public bool servering = false;
private Socket SocketListener;
public Socket ClientSocket;
private Thread ThreadListener;//服务器端侦听线程
private Hashtable _clients;
private int _port;
private int _maxBackLog;
private string _serverip;
private byte[] data = new byte[1024];
public Hashtable Clients
{
get { return _clients; }
}
public int Port
{
get { return _port; }
}
public int MaxBackLog
{
get { return _maxBackLog; }
}
public string serverip
{
get { return this._serverip; }
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="p">端口</param>
/// <param name="m">列队</param>
public TCPSockServer(string ip, int p, int m)
{
_serverip = ip;
_port = p;
_maxBackLog = m;
_clients = new Hashtable();
} public void StartServer()
{
ThreadListener = new Thread(new ThreadStart(StartListen));
ThreadListener.IsBackground = true;
ThreadListener.Start();//新开一个线程,用于接收客户端的连接
} public void StopServer()
{
StopListen();//结束侦听,并结束接收信息
} private void StartListen()
{
servering = true;
try
{
SocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(_serverip), _port);
SocketListener.Bind(remoteEP);
SocketListener.Listen(_maxBackLog);
while (servering)
{
Socket ServerSocket = SocketListener.Accept();
ClientSocket = ServerSocket;
if (_clients.Count >= _maxBackLog || !servering)
{
ServerSocket.Close();
}
else
{
Client client = new Client(ServerSocket);
client.thread = new Thread(new ParameterizedThreadStart(ServerReceive));
client.thread.IsBackground = true;
client.thread.Start(client);
}
Thread.Sleep(200);
}
}
catch (Exception e)
{
if (OnSockErr != null)
{
args.Msg = "服务端开始侦听发生错误:" + e.Message;
OnSockErr(this, args);
}
StopListen();//结束侦听
}
} private void ServerReceive(object ThreadData)
{
Client client = (Client)ThreadData;
try
{
while (client.online && servering)
{
if (client.socket == null || client.socket.Available < 1)
{
Thread.Sleep(200);
continue;
}
data = PreVarReceive(client.socket);
string msg = Encoding.Default.GetString(data);
if (msg != "")
{
string[] arr = msg.Split('|');
switch (arr[0])
{
case "Online":
client.name = arr[1];
if (!Add(client)) return;
break;
case "Exit":
Remove(client);
return;
case "RequestSendFile":
if (OnReceiveMsg != null)
{
NetArgs na = new NetArgs(client.name + "|" + msg);
OnReceiveMsg(this, na);
}
break;
case "ResposeSendFile":
if (OnReceiveMsg != null)
{
NetArgs na = new NetArgs(client.name + "|" + msg);
OnReceiveMsg(this, na);
}
break;
}
}
Thread.Sleep(200);
}
}
catch (Exception e)
{
if (OnSockErr != null)
{
args.Msg = "服务端侦听发生错误:" + e.Message;
OnSockErr(this, args);
}
}
} private bool Add(Client client)
{
if (!_clients.Contains(client.name))
{
_clients.Add(client.name, client);
if (OnConnect != null)
{
NetArgs na = new NetArgs(client.name);
OnConnect(this, na);
}
return true;
}
return false;
} private void Remove(Client client)
{
if (_clients.ContainsKey(client.name))
{
client.online = false;
if (client.socket != null)
{
client.socket.Close();
}
Thread.Sleep(200);
if (client.thread.IsAlive)
{
client.thread.Abort();
}
if (OnDisConnect != null)
{
NetArgs na = new NetArgs(client.name);
OnDisConnect(this, na);
}
Thread.Sleep(200);
_clients.Remove(client.name);
}
} public void Send(Client c, string msg)
{
try
{
data = Encoding.Default.GetBytes(msg);
int sent = PreVarSend(c.socket, data);
}
catch (Exception e)
{
if (OnSockErr != null)
{
args.Msg = "服务端发送信息失败:" + e.Message;
OnSockErr(this, args);
}
}
} private void StopListen()//结束侦听,并结束接收信息
{
servering = false;
lock (_clients.SyncRoot)
{
foreach (DictionaryEntry de in _clients)
{
Client c = (Client)de.Value;
if (c.socket != null)
{
c.socket.Shutdown(SocketShutdown.Both);
c.socket.Close();
}
Thread.Sleep(1000);
if (c.thread.IsAlive)
{
c.thread.Abort();
}
Thread.Sleep(200);
}
_clients.Clear();
}
SocketListener.Close();//关闭服务器侦听连接
Thread.Sleep(1000);
ThreadListener.Abort();//关闭服务器侦听线程
}
} public class Client
{
public bool online;
public Socket socket;
public Thread thread;
private string _name;
private string _remoteIP; public string name
{
set { _name = value; }
get { return _name; }
} public string remoteIP
{
get { return _remoteIP; }
} public Client(Socket s)
{
online = true;
socket = s;
_remoteIP = ((IPEndPoint)socket.RemoteEndPoint).Address.ToString();
}
} public abstract class TCPSock
{
public NetArgs args = new NetArgs(""); public byte[] PreVarReceive(Socket s)
{
int total = 0, recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, 0);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, 0);
if (recv == 0)
{
data = Encoding.Default.GetBytes("Exit");
break;
}
total += recv;
dataleft -= recv;
}
return data;
} public int PreVarSend(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
} private class NetArgs : EventArgs
{
public string Msg;
public NetArgs(string m)
{
Msg = m;
}
} public class UDP
{
public event NetReceiveMsg OnReceiveMsg;
public bool ListenerDone = false;
private int listenPort;
private Thread listenerThread;
private UdpClient listener;
public int ListenPort
{
get { return listenPort; }
} public UDP(int l)
{
listenPort = l;
} public void StartReceive()
{
ListenerDone = false;
listenerThread = new Thread(new ThreadStart(StartListener));
listenerThread.IsBackground = true;
listenerThread.Start();
} private void StartListener()
{
listener = new UdpClient(listenPort);
//任意IP,设端口为0表示任意
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
try
{
while (!ListenerDone)
{
byte[] bytes = listener.Receive(ref groupEP);
string strIP = groupEP.Address.ToString();
string strInfo = Encoding.GetEncoding("gb2312").GetString(bytes, 0, bytes.Length);
if (strInfo != null && strInfo != "" && OnReceiveMsg != null)
{
NetArgs na = new NetArgs("来自" + strIP + ":" + strInfo);
OnReceiveMsg(this, na);
}
Thread.Sleep(200);
}
}
catch
{
listener.Close();
}
} public void Send(IPAddress broadcast, string data)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
byte[] sendbuf = Encoding.GetEncoding("gb2312").GetBytes(data);
IPEndPoint ep = new IPEndPoint(broadcast, listenPort);
s.SendTo(sendbuf, ep);
} public void StopReceive()
{
ListenerDone = true;
listener.Close();
Thread.Sleep(200);
if (listenerThread.IsAlive)
{
listenerThread.Abort();
}
}
}
}
socket辅助类的更多相关文章
- c# socket 心跳 重连
/// <summary> /// 检查一个Socket是否可连接 /// </summary> /// <param name="socket"&g ...
- 动手实现一个较为简单的MQTT服务端和客户端
项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发) 平均估计每个每秒60个包 使用mqtt协 ...
- c# 创建socket连接辅助类-可指定超时时间
using AD.SocketForm.Model; using NLog; using System; using System.Net.Sockets; using System.Threadin ...
- c# 创建socket连接辅助类
using AD.SocketForm.Model; using NLog; using System; using System.Net; using System.Net.Sockets; nam ...
- ByteBuf和相关辅助类
当我们进行数据传输的时候,往往需要使用到缓冲区,常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer. 实际上,7种基础类型(Boolean除外)都有自己的缓冲区实现,对于NIO编程 ...
- Socket Programming in C#--Getting Started
Getting Started You can argue that one can overcome these shortcomings by multithreading meaning tha ...
- Java基于Socket文件传输示例(转)
最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...
- socket的NIO操作
一.前言 Java中直接使用socket进行通信的场景应该不是很多,在公司的一个项目中有这种需求,所以根据自己的理解和相关资料的参考,基于NIO 实现了一组工具类库,具体的协议还未定义,后续再整理 二 ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 续
转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...
随机推荐
- struts1.3中使用DispatchAction的一个问题
近期做项目发现我们公司的项目是用struts1写的,在多方百度下,总有理解了struts1.3的DispatchAction的使用方法 一:struts.xml文件的配置 <?xml versi ...
- 封装PDO操作数据库
<?php class DatabaseHandler { /** * sql语句查询 */ public static function query_data ($dataName,$sql, ...
- ActionChains报错问题总结
在使用Python2.7+Selenium3.0.2+Firefox50.1时,鼠标事件ActionChains运行总是报错,报错信息如下: C:\Python36\python3.exe C:/Us ...
- PE发送报文
步骤: 1. 在 action 中使用发送报文,要指定报文在 router 端的交易名称 2. 如果使用 supe.execute(context) 来发送,不需要第一步 3. 配置从网银到 rout ...
- 每天一点儿Java--list
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; /** * ...
- JMeter中使用Put请求方式请求接口
前言 现在有如下接口,是以PUT的方式请求的: 请求URL:IP+Port+/api/v1/apps/{appId} 请求参数: 参数名 必选 类型 nameCn 是 string nameEn 是 ...
- Android笔记之DrawerLayout的基本使用
效果图 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- Linux就该这么学--命令集合3(文本文件编辑命令)
1.cat命令查看纯文本文件(较短):(cat [选项] [文件]) cat -n showpath.sh 附录: -n 显示行号 -b 显示行号(不包括空行) -A 显示出“不可见”的符号,如空格, ...
- java 浮点数
package precisenumber; //import java.util.*;public class PreciseNumber { public int fore; public int ...
- iOS 打开应用与系统功能的调用
[[UIApplication sharedApplication] openURL:url]; 通过给url不同的值,可以实现调用系统自带 电话/短信/邮箱/浏览器/... 1.调用 电话pho ...