C# 实例中的套接字客户端编程错误并从服务器得到答复
我试图创建一个基于TCP/IP的套接字编程,在其中我试图在客户端和服务器之间建立连接 我连接了一个硬件,我的服务器是我的表单和硬件设备之间的接口 当我发送一些命令(ASCII值)时,服务器会响应 我的服务器运行得很好 当我点击按钮时,甚至我的客户机正在连接到服务器,我也能够向服务器发送消息 当我想从服务器接收消息时,问题就出现了 他们没有回应 下面是我的代码:C# 实例中的套接字客户端编程错误并从服务器得到答复,c#,multithreading,sockets,tcp-ip,C#,Multithreading,Sockets,Tcp Ip,我试图创建一个基于TCP/IP的套接字编程,在其中我试图在客户端和服务器之间建立连接 我连接了一个硬件,我的服务器是我的表单和硬件设备之间的接口 当我发送一些命令(ASCII值)时,服务器会响应 我的服务器运行得很好 当我点击按钮时,甚至我的客户机正在连接到服务器,我也能够向服务器发送消息 当我想从服务器接收消息时,问题就出现了 他们没有回应 下面是我的代码: public partial class Form1 : Form { System.Net.Sockets.TcpClient
public partial class Form1 : Form
{
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
NetworkStream serverStream = default(NetworkStream);
string readData = null;
public Form1()
{
InitializeComponent();
}
private void btnopen_Click(object sender, EventArgs e)
{
msg("Client Started");
clientSocket.Connect("127.0.0.1", 11111);
label1.Text = "Client Socket Program - Server Connected ...";
}
public void msg(string mesg)
{
textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + mesg;
}
private void btnSend_Click(object sender, EventArgs e)
{
try
{
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox1.Text + "$");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnRecieve_Click(object sender, EventArgs e)
{
try
{
serverStream = clientSocket.GetStream();
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox1.Text + "$");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
Thread ctThread = new Thread(getMessage);
ctThread.Start();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void getMessage()
{
while (true)
{
serverStream = clientSocket.GetStream();
int buffSize = 0;
byte[] inStream = new byte[10025];
buffSize = clientSocket.ReceiveBufferSize;
serverStream.Read(inStream, 0, buffSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
readData = "" + returndata;
msg();
}
}
private void msg()
{
if (this.InvokeRequired)
this.Invoke(new MethodInvoker(msg));
else
textBox2.Text = textBox2.Text + Environment.NewLine + " >> " + readData;
}
private void btnClose_Click(object sender, EventArgs e)
{
clientSocket.Close();
}
}
这是我的表单设计:
这里有一个典型错误,即忽略
Read
的返回值。你可能假设你在这里收到“消息”,但你没有。无法保证一侧对写入
/发送
的调用将与另一侧对读取
/接收
的调用1-1匹配。如果您想要消息传递,则由您自己在(潜在的)无限字节流的TCP抽象之上实现,或者移动到已经实现消息传递的更高级别协议。@Damien为什么这个问题一天被问五次,而我们不是还有一个规范副本吗。