У меня есть сервер winform и клиентские программы. оба подключены, клиент может отправлять данные на сервер и получать сервер. но когда сервер отправляет данные, клиент не может получить.Клиент не может получать данные, отправленные с сервера, но может отправлять данные только?
вот код для клиента, чтобы получить данные:
//RECIEVE PART
private Socket _clientSocket; // We will only accept one socket
private byte[] _buffer;
public Form1()
{
InitializeComponent();
StartRecieve();
}
#region Receiving Data
private void StartRecieve()
{
try
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333));
_serverSocket.Listen(10);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void AcceptCallback(IAsyncResult AR)
{
try
{
_clientSocket = _serverSocket.EndAccept(AR);
_buffer = new byte[_clientSocket.ReceiveBufferSize];
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ReceiveCallback(IAsyncResult AR)
{
try
{
int received = _clientSocket.EndReceive(AR);
Array.Resize(ref _buffer, received); // Shrink buffer to trim null characters
string text = Encoding.ASCII.GetString(_buffer);
Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize); // Regrow buffer
//AppendToTextBox(text);
MessageBox.Show(text);
// Start receiving data again
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
#region Display
/// <summary>
/// Provides a thread safe way to append text to the textbox
/// </summary>
private void AppendToTextBox(string text)
{
MethodInvoker invoker = new MethodInvoker(delegate
{
// Add two new lines afterwards
TboxDisp.Text += text + "\r\n" + "\r\n";
});
this.Invoke(invoker);
}
#endregion
//Connection Part
private void BtnConnect_Click(object sender, EventArgs e)
{
try
{
string ip = TboxIP.Text;
int port = int.Parse(TboxPort.Text);
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Connect to the host
_clientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port),
new AsyncCallback(ConnectCallback), null);
if (SocketConnected(_clientSocket) == true)
{
lblstatus.Text = "Establishing Connection to " + ip;
lblstatus2.Text = "Connection Established";
}
// Connect1(ip, port);
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}
//ends bending requests
private void ConnectCallback(IAsyncResult AR)
{
try
{
_clientSocket.EndConnect(AR);
EnableSearchButton();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//Enables the button search
private void EnableSearchButton()
{
MethodInvoker invoker = new MethodInvoker(delegate
{
BtnSearch.Enabled = true;
});
this.Invoke(invoker);
}
#endregion
private void BtnSearch_Click(object sender, EventArgs e)
{
try
{
// Serialize the textBoxes text before sending
// byte[] buffer = Encoding.ASCII.GetBytes(textBox.Text);
string command = "HELOTAGP/1.1\n";
byte[] buffer = Encoding.ASCII.GetBytes(command);
_clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//Ends pending asynchronous send
private void SendCallback(IAsyncResult AR)
{
try
{
_clientSocket.EndSend(AR);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
и полный код сервера (прием + отправка) составляет:
public partial class ServerForm : Form
{
private Socket _serverSocket;
private Socket _clientSocket; // We will only accept one socket
private byte[] _buffer;
public ServerForm()
{
InitializeComponent();
StartServer();
}
private void StartServer()
{
try
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333));
_serverSocket.Listen(10);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void AcceptCallback(IAsyncResult AR)
{
try
{
_clientSocket = _serverSocket.EndAccept(AR);
_buffer = new byte[_clientSocket.ReceiveBufferSize];
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ReceiveCallback(IAsyncResult AR)
{
try
{
int received = _clientSocket.EndReceive(AR);
Array.Resize(ref _buffer, received); // Shrink buffer to trim null characters
string text = Encoding.ASCII.GetString(_buffer);
Array.Resize(ref _buffer, _clientSocket.ReceiveBufferSize); // Regrow buffer
AppendToTextBox(text);
// Start receiving data again
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Provides a thread safe way to append text to the textbox
/// </summary>
private void AppendToTextBox(string text)
{
MethodInvoker invoker = new MethodInvoker(delegate
{
// Add two new lines afterwards
textBox.Text += text + "\r\n" + "\r\n";
});
this.Invoke(invoker);
}
//sending data
private void BtnSend_Click(object sender, EventArgs e)
{
try
{
// Serialize the textBoxes text before sending
string command = "Test";
byte[] buffer = Encoding.ASCII.GetBytes(command);
_clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void SendCallback(IAsyncResult AR)
{
try
{
_clientSocket.EndSend(AR);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
сервер получает данные правильно, но я не Не знаю, почему клиент не может получить с сервера. Не так ли происходит отправка сервера? или способ получения клиента неправильный? Должен ли я устанавливать IP-адрес для клиента?
Любая помощь приветствуется ....
Вы пробили дыру в брандмауэре своего клиента, чтобы разрешать подключения и трафик на порт 3333? –
@RichardTurner, как сервер, так и клиент работают на одном компьютере. брандмауэр имеет значение? – Liban
Как клиент, так и сервер выступают в качестве сервера .... оба слушают входящие соединения, а ни один не подключается. Пожалуйста, убедитесь, что данный код верен – Polity