public class SocketTcpClient
{
public static string ErrorMsg = string.Empty;
private static Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static string _serverIp = string.Empty;
private static int _port = ;
private static int _state = ;
private static readonly int _timeout = ; private static void ClearSocket()
{
if (_socket != null)
{
_socket.Close();
}
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
} private static bool Connect()
{
try
{
if (!_socket.Connected)
{
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(_serverIp), _port);
_socket.Connect(ep);
Thread.Sleep();
}
return true; }
catch (System.Exception ex)
{
ClearSocket();
ErrorMsg = "网络错误!原因:" + ex.Message;
return false;
}
} private static bool Send(byte[] byteArray)
{
bool bConnect = _socket.Connected;
if (!bConnect)
bConnect = Connect(); if (bConnect)
{
try
{
var numberOfBytesSent = _socket.Send(byteArray);
if (numberOfBytesSent == )
{
ClearSocket();
ErrorMsg = "网络错误!原因:发送时对方关闭socket连接";
return false;
}
return true;
}
catch (System.Exception ex)
{
ClearSocket();
ErrorMsg = "网络错误!原因:" + ex.Message;
return false;
}
}
return false;
} private static bool Receive(ref byte[] byteArray)
{
bool bConnect = _socket.Connected;
if (!bConnect)
bConnect = Connect(); if (bConnect)
{
MemoryStream ms = new MemoryStream();
byte[] readBuffer = new byte[*]; do
{
var numberOfBytesRead = ;
try
{
numberOfBytesRead = _socket.Receive(readBuffer);
}
catch (System.Exception ex)
{
ClearSocket();
ErrorMsg = "网络错误!原因:" + ex.Message;
return false;
} //对方关闭socket连接,上面的Read函数据阻塞取消,收到数据为0
if (numberOfBytesRead == )
{
ClearSocket();
ErrorMsg = "网络错误!原因:接收时对方关闭socket连接";
return false;
} //增加接收到的数据,并转化为MemoryStream
ms.Write(readBuffer, , numberOfBytesRead); } while (_socket.Connected && _socket.Available > ); byteArray = ms.ToArray();
return true;
}
return false;
} private static void RunWorkThread(object stateInfo)
{
DateTime dt = (DateTime) stateInfo;
while (true)
{
Thread.Sleep();
TimeSpan ts = DateTime.Now - dt;
if (_state == )
{
if (ts.Seconds > _timeout)
{
ClearSocket();
_state = ;
break;
}
}
else
{
break;
}
}
} private static bool SysCall(byte[] dataRequest, ref byte[] dataResponse)
{
_state = ;
ThreadPool.QueueUserWorkItem(RunWorkThread, DateTime.Now); bool bResult = false;
if (Send(dataRequest))
{
bResult = Receive(ref dataResponse);
} if (_state == )
{
ErrorMsg = "超时错误!";
}
else
{
_state = ;
}
return bResult;
} /// <summary>
/// 同步传输
/// </summary>
/// <param name="controller"></param>
/// <param name="action"></param>
/// <param name="msg">utf-8</param>
/// <returns></returns>
public static string SyncCallMessage(string controller, string action, string msg)
{
byte[] msgRequest = Encoding.UTF8.GetBytes(controller + " " + action + " " + msg + Environment.NewLine);
byte[] result = null;
string msgResult = null; //同步调用远程方法
bool bSuccess = SysCall(msgRequest, ref result);
if (bSuccess)
{
msgResult = Encoding.UTF8.GetString(result);
}
return msgResult;
} public static void SetServerIp(string serverIp, int port)
{
_serverIp = serverIp;
_port = port;
ClearSocket();
}
}
     public static class JsonConvert
{
public static string ToJsonEx(this object dto)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(dto);
} public static T FromJsonEx<T>(this string json)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
}
}

主要用在Pda开发数据通信方式,当然在Pda上用webrequest,拿到json解析也可以,以上Socket请求服务是同步的,如果需要稍微改善下,异步接收数据,那么服务器可以做到推送消息。

SocketTcpClient的更多相关文章

  1. Unity C# 自定义TCP传输协议以及封包拆包、解决粘包问题

    本文只是初步实现了一个简单的TCP自定协议,更为复杂的协议可以根据这种方式去扩展. TCP协议,通俗一点的讲,它是一种基于socket传输的由发送方和接收方事先协商好的一种消息包组成结构,主要由消息头 ...

  2. QT创建TCP Socket通信

    最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...

  3. Android之socket服务端

    import java.io.DataInputStream; import java.io.IOException; import java.io.PrintWriter; import java. ...

  4. 8.9.网络编程_Socket 远程调用机制

    1.网络编程 1.1.网络编程概述: 通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络.在操作系统.网络管理软件及网络 通信协议的管理和协调下,可以 ...

  5. 1、Socket通信

    [TCP] 服务器端:无目标插座升级为有目标插座后,就可以通过有目标的插座收发数据 客户端: 实战:此案例有利于理解Socket的工作流程. 缺点:服务器只能接收1个客户端的连接,因为只写了一个Acc ...

随机推荐

  1. iOS开发 Masonry的简单使用

    首先,在正式使用Masonry之前,我们先来看看在xib中我们是如何使用AutoLayout     从图中我们可以看出,只要设置相应得局限,控制好父视图与子视图之间的关系就应该很ok的拖出你需要的需 ...

  2. Knockout学习笔记之一

    1.  四大关键理念: A. DeclarativeBindings(声明式绑定) Easily associate DOM elements with model data using a conc ...

  3. javascript中对象的深度克隆

    记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...

  4. page,client,offset区别

    offset:相对于当前“盒子”的距离 ,与滚动条无关 client:相对于可视区域的距离,与滚动条无关 page:相对于整个页面的距离,与滚动条有关 示例代码: <!DOCTYPE html& ...

  5. Svn与Git的一些区别(转载)

    把第一条理解到位思想到位了做起来才会有的放矢,其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点,上手会很容易,声明一点Git并不是目前唯一的分布式版本 ...

  6. Python’s SQLAlchemy vs Other ORMs[转发 5] PonyORM

    PonyORM PonyORM allows you to query the database using Python generators. These generators are trans ...

  7. spring mvc拦截器和<mvc:annotation-driven />的详解

    MVC的拦截器 经本人在Spring mvc中对方案1和方案2的测试表明,并没有拦截静态资源,所以可以放心使用方案1和方案2,方案3可以放弃,并且可以放心使用<mvc:annotation-dr ...

  8. iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)

    iOS开发拓展篇—UIDynamic(重力行为+碰撞检测) 一.重力行为 说明:给定重力方向.加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化 - (inst ...

  9. php max_input_vars限制数组大小

    今天做一个项目需要post2000个数组过去,发现一直只能接到一半,后来发现是max_input_vars显示问题. 修改php.ini里面max_input_vars的大小就可以了

  10. UISlider

    UISlider是iOS中的滑块控件 通常⽤于控制视频播放进度,控制⾳量等. 它继承于UIControl,滑块提供了⼀系列连续的值,滑块停 在不同的位置,获取到滑块上的值也不同.   minimumV ...