110,537
社区成员
发帖
与我相关
我的任务
分享
/// 建立连接zuo
/// </summary>
private void ServerStar()
{
this.SocketServer("192.168.235.170", 4005);
}
/// <summary>
/// 服务端
/// </summary>
private void SocketServer(string host, int port)
{
try
{
//服务器IP地址
IPAddress ip = IPAddress.Parse(host);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, port)); //绑定IP地址:端口
serverSocket.Listen(500);
this.label1.Text = string.Format("启动监听{0}", serverSocket.LocalEndPoint.ToString());
//通过Clientsoket发送数据
Thread myThread = new Thread(ListenClientConnect);
myThread.Start();
}
catch (ArgumentNullException ex)
{
LogHelper.CreateLogTxt("ArgumentNullException" + ex.Message);
}
catch (SocketException ex)
{
LogHelper.CreateLogTxt("SocketException" + ex.Message);
}
}
/// <summary>
/// 监听客户端连接
/// </summary>
private void ListenClientConnect()
{
try
{
Socket clientSocket = serverSocket.Accept();
if (clientSocket.Connected == true)
{
//获取请求连接的IP
IPAddress clientIP = ((IPEndPoint)clientSocket.RemoteEndPoint).Address;
ipaddrssList.Add(clientIP);
Thread thread = new Thread(new ParameterizedThreadStart(ReceiveMessage));
thread.Start(clientSocket);
}
}
catch (Exception ex)
{
LogHelper.CreateLogTxt(ex.Message);
}
}
public static void ClientAccepted(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
var client = socket.EndAccept(ar);
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
//准备接受下一个客户端请求
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
}
while (byteQueue.Find())
{
byte[] readBuffer = byteQueue.Dequeue();
string data = BitConverter.ToString(readBuffer);
if (data.StartsWith("FF-FF-FF-FF-CA-CB-CC-CD") && data.EndsWith("EA-EB-EC-ED"))
{
var message = BitConverter.ToString(buffer, 0, length);
//显示消息
Console.WriteLine(message);
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);//这句位置放错了
}
}
要这样放
while (byteQueue.Find())
{
byte[] readBuffer = byteQueue.Dequeue();
string data = BitConverter.ToString(readBuffer);
if (data.StartsWith("FF-FF-FF-FF-CA-CB-CC-CD") && data.EndsWith("EA-EB-EC-ED"))
{
var message = BitConverter.ToString(buffer, 0, length);
//显示消息
Console.WriteLine(message);
}
}
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
放到While之外
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace ConsoleApplication36
{
class Program
{
static void Main(string[] args)
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.103"), 4001));
socket.Listen(500);
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
Console.WriteLine("Server is ready!");
Console.Read();
}
public static void ClientAccepted(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
var client = socket.EndAccept(ar);
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
//准备接受下一个客户端请求
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
}
static byte[] buffer = new byte[1024];
public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket;
var length = socket.EndReceive(ar);
ByteQueue byteQueue = new ByteQueue();
byteQueue.Enqueue(buffer);
while (byteQueue.Find())
{
byte[] readBuffer = byteQueue.Dequeue();
string data = BitConverter.ToString(readBuffer);
if (data.StartsWith("FF-FF-FF-FF-CA-CB-CC-CD") && data.EndsWith("EA-EB-EC-ED"))
{
var message = BitConverter.ToString(buffer, 0, length);
//显示消息
Console.WriteLine(message);
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Collections;
using System.Runtime.InteropServices;
namespace ConsoleApplication38
{
class Program
{
static void Main(string[] args)
{
new Program().SocketServer("192.168.0.103", 4001);
Console.ReadLine();
}
private AsyncCallback m_OnAccept;
private static Socket serverSocket;
/// <summary>
/// 服务端
/// </summary>
private void SocketServer(string host, int port)
{
m_OnAccept = new AsyncCallback(OnAccept);
try
{
//服务器IP地址
IPAddress ip = IPAddress.Parse(host);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, port)); //绑定IP地址:端口
serverSocket.Listen(500); //设定最多250个排队连接请求
//this.label1.Text = string.Format("启动监听{0}", serverSocket.LocalEndPoint.ToString());
//通过Clientsoket发送数据
serverSocket.BeginAccept(m_OnAccept, serverSocket);
}
catch (ArgumentNullException ex)
{
//LogHelper.CreateLogTxt("ArgumentNullException" + ex.Message);
}
catch (SocketException ex)
{
//LogHelper.CreateLogTxt("SocketException" + ex.Message);
}
}
private void OnAccept(IAsyncResult asyncResult)
{
Socket m_ServerSocket = (Socket)asyncResult.AsyncState;
Socket accepted = null;
if (m_ServerSocket == null)
return;
try
{
accepted = m_ServerSocket.EndAccept(asyncResult);
}
catch (SocketException ex)
{
}
catch (ObjectDisposedException)
{
return;
}
catch
{
return;
}
if (accepted != null)
{
AcceptSession(accepted);
}
m_ServerSocket.BeginAccept(m_OnAccept, m_ServerSocket);
}
List<Session> sessionList = new List<Session>();
private void AcceptSession(Socket socket)
{
Session s = new Session(socket);
sessionList.Add(s);
}
public class Session
{
ByteQueue queue = new ByteQueue();
HistoryByteQueue historyQueue = new HistoryByteQueue();
private SocketAsyncEventArgs receiveArgs = new SocketAsyncEventArgs();
private int _ConnectionID;
public int ConnectionID
{
get { return _ConnectionID; }
set { _ConnectionID = value; }
}
private IPAddress m_Address;
private string m_ToString;
private Socket m_Socket;
private byte[] m_RecvBuffer = new byte[1024];
int posid;
public Session(Socket socket)
{
m_Socket = socket;
this.ConnectionID = Interlocked.Increment(ref _ConnectionID);
receiveArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceive);
receiveArgs.SetBuffer(m_RecvBuffer, 0, m_RecvBuffer.Length);
this.m_Address = ((IPEndPoint)this.m_Socket.RemoteEndPoint).Address;
this.m_ToString = this.m_Address.ToString();
m_Socket.ReceiveAsync(receiveArgs);
//根据IP地址查询断面编号
//posid = RadarStatisticsService.GetPosID(this.m_Address);
}
private void OnReceive(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
{
int byteCount = e.BytesTransferred;
byte[] buffer = e.Buffer;
byte[] readBuffer = new byte[byteCount];
System.Buffer.BlockCopy(buffer, 0, readBuffer, 0, byteCount);
queue.Enqueue(readBuffer);
while (queue.Find())
{
byte[] reallData = queue.Dequeue();
string data = BitConverter.ToString(reallData);
if (data.StartsWith("FF-FF-FF-FF-CA-CB-CC-CD") && data.EndsWith("EA-EB-EC-ED"))
{
string repStr = data.Replace("-", " ");
Regex regex = new Regex("07 81 08.{24}");
MatchCollection matches = regex.Matches(repStr, 0);
if (matches.Count > 0)
{
//List<T_RadarStatistics> statisticsList = Common.HandleStatisticsData(repStr, this.m_Address, posid);
//Thread threadStatistics = new Thread(new ParameterizedThreadStart(GetStatisticsListByIP)); //这是啥线程没看懂
//threadStatistics.Start(statisticsList);
}
}
}
}
}
}
}
}
public static void ClientAccepted(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
var client = socket.EndAccept(ar);
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
//准备接受下一个客户端请求
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
}
[/quote]
缓冲是对的,但你所用的缓冲方式不正确。。因为你没有给每个连接建立单独的缓冲,“单独”明白没,你上面是用同一个缓冲来接收所有的连接过来数据,导至你无法区分数据协议了。。。