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. 如何管理linux开机自启服务

    如何管理linux开机自启服务? 自启动服务非常重要,例如 (1)需要手动添加希望自启的服务,如安装svn后没有自动添加,就需要我们手动加入(2)安装某些程序后,自动加到自启动了,但我们不需要,需要手 ...

  2. 各种效果的tab选项卡

    ;(function($){ $.fn.tabso=function( options ){ var opts=$.extend({},$.fn.tabso.defaults,options ); r ...

  3. python访问数据库一

    直接访问mysql,示例如下: # coding:utf-8 import time import MySQLdb # import traceback # import sys conn = MyS ...

  4. stash存储

    比如我的fsm_ngh分支,被a修改了,可是我本地还有没有提交的东西,就不能切换分支也不能下拉,也不能直接上传,否则分支会混乱. 这个时候stash的优点来了,先把你修改的暂存隐藏起来,然后pull远 ...

  5. org.springframework.web.context.ContextLoaderListener(转载)

    ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web ...

  6. WCF初探-8:WCF服务承载 (上)

    前言 任何一个程序的运行都需要依赖一个确定的进程中,WCF服务也不例外.如果使用WCF服务,我们就必须将服务承载于创建它并控制它的上下文和生存期的运行时环境中,承载服务环境的程序,我们称之为宿主.WC ...

  7. UITableViewCell自定义

    ⼀.⾃定义Cell     UITableView中系统的cell共提供了四种默认样式,分别是: UITableViewCellStyleDefault UITableViewCellStyleVal ...

  8. Jmeter—6 CSV Data Set Config 通过文件导入数据

    线程组循环次数大于1的时候,请求里每次提交的数据都相同.有的系统限制了不能提交相同数据,我们通过 CSV Data Set Config 加载csv文件数据. 1 创建一个文本文件,输入参数值保存为. ...

  9. 《Java中的包机制》

    /* 包的机制:(1) */ package lee; public class PackageTest { public void Test(int num) { System.out.printl ...

  10. 软件项目第一个Sprint评论

    团队软件评论: 极速蜗牛:个人认为,内部测试版应该是实现内容而不是UI界面,难道要让那些懂电脑的人们都去玩用户界面吗?UI界面完全可以放到beta版再进行修改,美工.不过这界面做的确实还可以.运行此游 ...