我有一个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地址?
感谢任何帮助......
答案 0 :(得分:0)
你误解了套接字的使用。套接字具有读通道和写通道。两个通道彼此隔离。查看您的客户端代码,使用'serverSocket'来监听传入的数据,同时使用'clientSocket'将数据发送到服务器。相反,您应该使用同一个套接字的读写通道。
作为说明:已连接TCP套接字。这意味着对于每个套接字,在使用套接字之前需要连接。在套接字上侦听意味着您希望连接到。在您的客户端中,'clientSocket'连接到服务器,但'serverSocket'从不连接到服务器,也不是服务器连接到客户端(它不应该连接)。