Моя проблема в том, когда мой клиент отправляет данные, мой сервер делает это только для получения первого отправленного сообщения. Все последующие клиентские сообщения, которые сервер не получает. Если я отлаживаю клиента, он не генерирует никаких исключений, поэтому я думаю, что проблема связана с принятием сервера.C# - Серверный сокет не извлекает данные
Может кто-нибудь сказать, как исправить мой код, который мой клиент может отправить несколько раз на сервер, не создавая новый сокет (на клиенте) для каждого сообщения?
Сервер:
static Socket connection;
static IPEndPoint endpoint;
const int BUFFER_SIZE = 1024;
static byte[] buffer;
static void Main(string[] args)
{
connection = new Socket(SocketType.Stream, ProtocolType.Tcp);
endpoint = new IPEndPoint(IPAddress.Any, 1337);
connection.Bind(endpoint);
connection.Listen(10);
buffer = new byte[BUFFER_SIZE];
connection.BeginAccept(new AsyncCallback(AsyncAccept),null);
Console.ReadLine();
}
private static void AsyncAccept(IAsyncResult ar)
{
Socket s = connection.EndAccept(ar);
s.BeginReceive(buffer,0,BUFFER_SIZE, SocketFlags.None, new AsyncCallback(AsyncReceive),s);
connection.BeginAccept(new AsyncCallback(AsyncAccept), null);
}
static void AsyncReceive(IAsyncResult ar)
{
Socket s = (Socket)ar.AsyncState;
int received = s.EndReceive(ar); //END
byte[] data = new byte[received];
Array.Copy(buffer, data, received);
string text = Encoding.Default.GetString(data);
Console.WriteLine(text);
}
Клиент:
Socket c;
IPEndPoint endpoint;
string text;
public MainWindow()
{
InitializeComponent();
c = new Socket(SocketType.Stream, ProtocolType.Tcp);
endpoint = new IPEndPoint(IPAddress.Loopback, 1337);
c.Connect(endpoint);
}
private void Send()
{
byte[] buffer = Encoding.Default.GetBytes(text);
c.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendAsync), c);
}
private void SendAsync(IAsyncResult ar)
{
Socket s = (Socket)ar.AsyncState;
s.EndSend(ar);
}
private void btnSend_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(Send);
text = txtMessage.Text;
t.IsBackground = true;
t.Start();
}
Фрагмент (подумайте о пересмотре). – deloreyk