C# 套接字:服务器不发送消息



我正在通过套接字进行通信,但我从服务器发送数据有问题。我能够在收到某些内容后发送响应,但我需要能够在没有事先从客户端接收任何内容的情况下发送消息。

我想做的基本上是在连接建立后通过套接字发送一个命令。(在调用AcceptCallback()之后,我检查了一下)。在我的主程序我有一个按钮,我希望能够随时点击发送一定的消息。然而,每次我尝试这样做,我得到一个错误,我不能在一个未连接的套接字上做任何事情。

正如您在代码中看到的,我试图在从客户端接收到一些东西后发送另一条消息(参见我发送"Test send"的ReceiveCallback())。发送工作,但如果我想在之后发送其他东西,它再次给出错误,我不能通过已断开的套接字发送东西。

当前代码看起来像这样(摘录):

class SocketServer
{
private static Socket _serverSocket;
//Konstruktor
public SocketServer(int port = 9851)
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Socket Objekt
lep = new IPEndPoint(IPAddress.Any, 9851);
}
private static void AcceptClient()
{
try
{
_serverSocket.Bind(lep); 
_serverSocket.Listen(100);                 
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); //auf Verbindungen warten weiter bei AcceptCallback Methode
}
catch 
{
...
}
}
private static void AcceptCallback(IAsyncResult AR)     //Connection accept callback
{

try
{
Socket socket = _serverSocket.EndAccept(AR); 
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); 
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); 
}
catch (ObjectDisposedException e)
{
...
}
}
private static void ReceiveCallback(IAsyncResult AR)//Weiterführung Empfangen
{
Socket socket = (Socket)AR.AsyncState;
try
{
received = socket.EndReceive(AR); //Speichere Anzahl empfangener Bytes
... //trimming and saving the received data in a string
sending = "Test send";
byte[] data = Encoding.UTF8.GetBytes(sending);  
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); 
}
catch (ObjectDisposedException e)
{
...
}
}
public void SendMessage() 
{
byte[] data = Encoding.UTF8.GetBytes(sending);  
_serverSocket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), _serverSocket); //Beginnen des Sendevorgangs weiter bei SendCallback
...
}
private static void SendCallback(IAsyncResult AR) 
{
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
...
}
这个问题我已经研究了一个多星期了。很难说我以前尝试过什么,因为我觉得我已经尝试了所有的方法,并在互联网的最深处寻求帮助。所以我站在这些可能性面前,a)我在某个地方超级失明,b)我过度劳累,或者c)这实际上是不可能的,对不起,Rhino你需要放弃你的项目,重新开始。 无论如何,我将感激任何形式的帮助。谢谢。

我是这样解决我的问题的:问题是,我没有使用BeginSend(…)的套接字连接,我已经使用EndAccept(),这只是命名为套接字。为了能够在任何其他方法(而不仅仅是AcceptCallback())中使用这个特定的套接字,我必须使其可访问。我创建了一个列表,将可接受的套接字保存在_clientSockets中,并将每个可接受的套接字添加到该列表中。现在看起来像这样(只有更改的部分):

class SocketServer
{
private static Socket _serverSocket;
private static List<Sockets> _clientSockets=new List<Socket>();
private static void AcceptClient()
{
try
{
_serverSocket.Bind(lep); 
_serverSocket.Listen(100);                 
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); //auf Verbindungen warten weiter bei AcceptCallback Methode
}
catch 
{
...
}
}
private static void AcceptCallback(IAsyncResult AR)     //Connection accept callback
{

try
{
Socket socket = _serverSocket.EndAccept(AR); 
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); 
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); 
_clientSockets.Add(socket); //This is the important part where I add the completed socket connection to the list!
}
catch
{
...
}
}
public void SendMessage(string sdata, int socketno) 
{
Socket socket = _clientSockets[socketno] //Here I give the socket from before, or whichever one I choose, to this method to proceed with
byte[] data = Encoding.UTF8.GetBytes(sdata);  
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); //Beginnen des Sendevorgangs weiter bei SendCallback
...
}
private static void SendCallback(IAsyncResult AR) 
{
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
...
}

最新更新