<span style="background-color: rgb(255, 255, 255);"> 之前没做过sokect连接相关内容,第一次做,不对的希望大家指正。</span>
<span style="background-color: rgb(255, 255, 255);">1.server端ip和端口号写入配置文件中</span>
<? xml version = "1.0 " encoding = "utf-8 " ?>
< SocketConfig xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance " xmlns:xsd = "http://www.w3.org/2001/XMLSchema " >
< IPAddress >111.111.111.111 </ IPAddress>
< Port >123</ Port>
</ SocketConfig >
<span style="background-color: rgb(255, 255, 255);">2.server端代码:</span>
/// <summary>
/// Socket配置文件路径.
/// </summary>
private readonly static string ConfigPath = System.Web.HttpContext .Current.Server.MapPath("\\ Config\\SocketConfig.xml" );
static void Sokect()
{
// 加载配置文件并获取SocketConfig节点.
XElement xElmSocketConfig = XDocument .Load(ConfigPath).Element("SocketConfig");
// 取得IP地址节点.
XElement xElmIpAddress = xElmSocketConfig.Element("IPAddress");
// 取得的IP地址节点为空的场合.
if (xElmIpAddress == null )
{
// 直接返回.
return;
}
// 取得IP地址.
IPAddress ipAddress = IPAddress .Parse(xElmIpAddress.Value);
// 定义端口号.
int iPort = 0;
// 取得端口号节点.
XElement xElmPort = xElmSocketConfig.Element("Port");
// 取得的端口号节点不为空的场合.
if (xElmPort != null )
{
// 取得端口号的值.
Int32.TryParse(xElmPort.Value, out iPort);
}
// 定义网络端点.
IPEndPoint ipe = new IPEndPoint(ipAddress, iPort);
//创建一个Socket对象,如果用UDP协议,则要用SocketTyype.Dgram类型的套接字
Socket socket = new Socket( AddressFamily.InterNetwork, SocketType .Stream, ProtocolType .Tcp);
//绑定EndPoint对象
socket.Bind(ipe);
//开始监听
socket.Listen(100);
//接受到Client连接,为此连接建立新的Socket,并接受消息
Socket temp = socket.Accept();
string recvStr = "" ;
byte[] recvBytes = new byte[1024];
int bytes;
//从客户端接受消息
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
//给Client端返回信息
byte[] sendbytes = Encoding .UTF8.GetBytes("0");
//返回信息给客户端
temp.Send(sendbytes, sendbytes.Length, 0);
}
/// <summary>
/// 建立Socket连接处理.
/// </summary>
private bool CreateSocketConnect()
{
try
{
// 取得服务器IP地址.
IPAddress ipAddress = IPAddress .Parse("117.0.0.1");
// 实例化IPEndPoint.
IPEndPoint iep = new IPEndPoint(ipAddress,1100);
// socketClient为空的场合.
if (_socketClient == null )
{
// 实例化Socket实例.
_socketClient = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType .Tcp);
}
// socketClient处于非连接状态的场合.
if (!_socketClient.Connected)
{
// 创建Socket连接.
_socketClient.Connect(iep);
// 等一下,服务器处理信息可能会太快.
Thread.Sleep(100);
// 发送当前售货机的Mac地址.
SendMessage( "0");
// 定义新的线程.
Thread thread = new Thread(WaitForReceiveData)
{
// 设置线程为后台线程.
IsBackground = true
};
// 启动线程.
thread.Start();
}
return true ;
}
catch (Exception ex)
{
return false ;
}
}
/// <summary>
/// 发送消息到服务器处理.
/// </summary>
/// <param name="strMessage"> 消息数据 </param>
private void SendMessage(string strMessage)
{
try
{
byte[] sendbytes = Encoding .UTF8.GetBytes(strMessage);
_socketClient.Send(sendbytes, sendbytes.Length, SocketFlags.None);
if (!string .IsNullOrEmpty(strMessage))
{
}
}
catch (Exception e)
{
throw new Exception( "向服务器发送消息" + strMessage + "失败:" + e.Message);
}
}
/// <summary>
/// 等待接收服务器发送来的数据.
/// </summary>
private void WaitForReceiveData()
{
// 循环接收数据.
do
{
try
{
// SocketClient为空的场合.
if (_socketClient == null || !_socketClient.Connected)
{
// 直接结束.
break;
}
// 发送0个字节到服务器,监测Socket是否处于连接状态.
SendMessage( string.Empty);
// 定义缓冲区.
byte[] bytes = new byte[1024];
// 接收数据.
int bytesRec = _socketClient.Receive(bytes);
// 数据字节数不为0的场合.
if (bytesRec != 0)
{
// 取得接收的字符串.
string strMessage = Encoding .UTF8.GetString(bytes).Trim('\0 ');
}
}
catch (Exception e)
{
break;
}
// 等待100毫秒.
System.Threading. Thread.Sleep(100);
} while (true );
}