使用tcp协议,链接服务器的方法
/// <summary>
/// 连接使用tcp协议的服务端
/// </summary>
/// <param name="ip">服务端的ip</param>
/// <param name="port">服务端的端口号</param>
/// <returns></returns>
public static Socket ConnectServer(string ip, int port)
{
Socket s = null;
try
{
IPAddress ipAddress = IPAddress.Parse(ip);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);
s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Connect(ipEndPoint);
if (s.Connected == false) s = null;
}
catch (Exception)
{
}
return s;
}

发送数据:

        /// <summary>
/// 向远程主机发送数据
/// </summary>
/// <param name="socket">连接到远程主机的socket</param>
/// <param name="buffer">待发送数据</param>
/// <param name="outTime">发送超时时长,单位是秒(为-1时,将一直等待直到有数据需要发送)</param>
/// <returns>0:发送成功;-1:超时;-2:出现错误;-3:出现异常</returns>
public static int SendData(Socket socket, byte[] buffer, int outTime)
{
if (socket == null || socket.Connected == false)
{
throw new ArgumentException("参数socket为null,或者未连接到远程计算机");
}
if (buffer == null || buffer.Length == )
{
throw new ArgumentException("参数buffer为null ,或者长度为 0");
} int flag = ;
try
{
int left = buffer.Length;
int sndLen = ;
int hasSend = ; while (true)
{
if ((socket.Poll(outTime * , SelectMode.SelectWrite) == true))
{
// 收集了足够多的传出数据后开始发送
sndLen = socket.Send(buffer, hasSend, left, SocketFlags.None);
left -= sndLen;
hasSend += sndLen; // 数据已经全部发送
if (left == )
{
flag = ;
break;
}
else
{
// 数据部分已经被发送
if (sndLen > )
{
continue;
}
else // 发送数据发生错误
{
flag = -;
break;
}
}
}
else // 超时退出
{
flag = -;
break;
}
}
}
catch (SocketException)
{
//Log
flag = -;
}
return flag;
}

发送string数据,用到方法System.Text.Encoding.Default.GetBytes对上面的方法进行封装

     /// <summary>
/// 向远程主机发送数据
/// </summary>
/// <param name="socket">连接到远程主机的socket</param>
/// <param name="buffer">待发送的字符串</param>
/// <param name="outTime">发送数据的超时时间,单位是秒(为-1时,将一直等待直到有数据需要发送)</param>
/// <returns>0:发送数据成功;-1:超时;-2:错误;-3:异常</returns>
public static int SendData(Socket socket, string buffer, int outTime)
{
if (buffer == null || buffer.Length == )
{
throw new ArgumentException("buffer为null或则长度为0.");
}
return SendData(socket, System.Text.Encoding.Default.GetBytes(buffer), outTime);
}

接收数据:

        /// <summary>
/// 接收远程主机发送的数据
/// </summary>
/// <param name="socket">要接收数据且已经连接到远程主机的</param>
/// <param name="buffer">接收数据的缓冲区(需要接收的数据的长度,由 buffer 的长度决定)</param>
/// <param name="outTime">接收数据的超时时间,单位秒(指定为-1时,将一直等待直到有数据需要接收)</param>
/// <returns></returns>
public static int RecvData(Socket socket, byte[] buffer, int outTime)
{
if (socket == null || socket.Connected == false)
{
throw new ArgumentException("socket为null,或者未连接到远程计算机");
}
if (buffer == null || buffer.Length == )
{
throw new ArgumentException("buffer为null ,或者长度为 0");
} buffer.Initialize();
int left = buffer.Length;
int curRcv = ;
int hasRecv=;
int flag = ; try
{
while (true)
{
if (socket.Poll(outTime * , SelectMode.SelectRead) == true)
{
// 已经有数据等待接收
curRcv = socket.Receive(buffer, hasRecv, left, SocketFlags.None);
left -= curRcv;
hasRecv += curRcv; // 数据已经全部接收
if (left == )
{
flag = ;
break;
}
else
{
// 数据已经部分接收
if (curRcv > )
{
continue;
}
else // 出现错误
{
flag = -;
break;
}
}
}
else // 超时退出
{
flag = -;
break;
}
}
}
catch (SocketException)
{
//Log
flag = -;
}
return flag;
}

原文地址:http://blog.csdn.net/love__coder/article/details/6649688

Socket通信常用方法的更多相关文章

  1. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  2. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  3. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  6. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  7. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  8. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  9. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

随机推荐

  1. [转]通过PowerShell工具跨多台服务器执行SQL脚本

    转至:http://www.cnblogs.com/SameZhao/p/4743692.html 有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心 ...

  2. rqnoj-342-最不听话的机器人-dp

    dp[i][j][k][[l]: 执行第i步,执行到点(j,k),方向为l时,用的最大步数. 状态转移根据step[i]转移. #include<stdio.h> #include< ...

  3. android 项目学习随笔二十一(IM、语音识别、机器人、统计、扫描二维码、条形码)

    语音识别:科大讯飞语音云 http://www.xfyun.cn/ 语音机器人模拟 public class TalkBean { public String text; public boolean ...

  4. 转载:JMS-ActiveMQ浅析

    ActiveMQ 即时通讯服务 浅析 一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE ...

  5. 深拷贝 vs 浅拷贝 释放多次

    如果类中有需要new的数据,那么一定要注意delete; 如果只free一次,但是提示free多次,一定要注意了,有可能是因为你没有定义拷贝函数! 以我的亲身经历来说: operater *(mycl ...

  6. plsql日期乱码

    乱码状况如截图: 控制面板\所有控制面板项\系统\高级系统设置\环境变量, 设置系统变量,变量名:NLS_LANG,变量值:Simplified Chinese_China.AL32UTF8改为SIM ...

  7. IOS 网络请求中设置cookie

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   1. ASIHTTPRequest ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 A ...

  8. 微信开放平台API开发资料

    微信大概两年前开启了微信公众平台的API供开发者使用,从账号登陆.消息发送.用户账号管理.公众号菜单.客服接口.微信商店接口.用户卡券接口 以及微信支付接口.可以说是全方面覆盖了电商所需要的要素,与阿 ...

  9. MySQL查询表内重复记录

    查询及删除重复记录的方法(一)1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select p ...

  10. java 模拟消息的发送功能

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; /* * 完成消息的发送功能 * 在发送消息之前, ...