C# 是否连续将字节[]从服务器发送到客户端?
我对这个很陌生,我只想从控制台服务器窗口向客户端发送一条消息 这是我的服务器:C# 是否连续将字节[]从服务器发送到客户端?,c#,networking,tcpclient,C#,Networking,Tcpclient,我对这个很陌生,我只想从控制台服务器窗口向客户端发送一条消息 这是我的服务器: static void Main(string[] args) { try { IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8000); Socket newsock = new Socket(AddressFamil
static void Main(string[] args)
{
try
{
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 8000);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
newsock.Bind(localEndPoint);
newsock.Listen(10);
Socket client = newsock.Accept();
if (client.Connected)
{
Console.WriteLine("client connected.");
}
string msg = "Who's there?";
byte[] buffer = new byte[msg.Count()];
buffer = Encoding.ASCII.GetBytes(msg);
client.Send(buffer);
当我使用上面的client.Send()时,它工作得很好,但当我按照下面的操作时,另一端没有收到任何信息。由于客户端已连接,我看不出它失败的原因
while (client.Connected)
{
Console.WriteLine("enter msg: ");
string userMsg = Console.ReadLine();
byte[] userBuffer = new byte[userMsg.Count()];
userBuffer = Encoding.ASCII.GetBytes(userMsg);
client.Send(userBuffer);
Console.ReadKey();
}
}
catch (Exception e)
{
Console.WriteLine("Error: " + e);
}
}
以下是客户端的代码:
public partial class MainWindow : Window
{
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000);
byte[] buffer = new byte[12];
public MainWindow()
{
InitializeComponent();
}
private void btn_Connect_Click(object sender, RoutedEventArgs e)
{
server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
server.Connect(ipep);
if (server.Connected)
{
txt_Log.AppendText("\nConnected to target server.");
}
btn.IsEnabled = false;
btn_disc.IsEnabled = true;
}
private void btn_Disconnect_Click(object sender, RoutedEventArgs e)
{
server.Close();
if (!server.Connected)
{
txt_Log.AppendText("\nDisconnected to target server.");
}
btn.IsEnabled = true;
btn_disc.IsEnabled = false;
}
private void btn_Fetch_Click(object sender, RoutedEventArgs e)
{
if (buffer != null)
{
using (server)
{
server.Receive(buffer);
txt_Log.AppendText(System.Text.Encoding.Default.GetString(buffer));
buffer = null;
}
}
else
{
txt_Log.AppendText("\nNo data to send.");
}
}
}
我已经运行了你的服务器代码。没有问题 对于客户机,似乎是您处理了服务器,从而断开了连接?并将缓冲区设为空,因此您也不能重复使用 我编写了一些测试客户机代码,似乎运行良好
class Program
{
static void Main(string[] args)
{
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Connect("127.0.0.1", 8000);
byte[] buffer = new byte[1024];
while (true)
{
int bytes = server.Receive(buffer);
Console.WriteLine(System.Text.Encoding.Default.GetString(buffer, 0, bytes));
}
}
}
注意,这里的要点是,您不会在每次读取数据包时都断开客户端的连接,如果您在读取数据包之前将静态设置为null,然后执行null check,则该设置将为null,因此fetch将只工作一次,因此不要这样做!
正如Mark所说,检查从呼叫和接收中读取的字节数,这样您就可以知道要解码多少字节。更改
private void btn_Fetch_Click(object sender, RoutedEventArgs e)
{
if (buffer != null)
{
using (server)
{
server.Receive(buffer);
txt_Log.AppendText(System.Text.Encoding.Default.GetString(buffer));
buffer = null;
}
}
else
{
txt_Log.AppendText("\nNo data to send.");
}
}
到
并在窗口关闭时调用dispose
protected override void OnClosed(EventArgs e) {
base.OnClosed(e);
server.Dispose();
}
您的
btn\u Fetch\u单击时发生了什么?它是否写“没有要发送的数据”?或注意:接收代码严重损坏;TCP数据通常是一个流——您并不总是在发送它们的方便的块中“接收”东西;您应该检查Receive
的返回值,它告诉您它读取的字节数(这不需要是一条完整的消息;它可以是一个字节,可以是27条消息)。另外:您是否在套接字上启用了NoDelay
?请阅读TCP套接字教程。这里有一些常见的错误。@MarcGravel我想做的是,每次我按下“Fetch”,客户机都会收到服务器想要发送的任何数据。没有,任何地方都没有节点。:)@usr抱歉,我已经读了很多,但这是我理解的程度。当我测试你的代码时,连接被拒绝。System.Net.Sockets.SocketException(0x80004005):连接refused@BohaoLI我猜要么是服务器没有运行,要么是在不同的端口上运行,要么是在不同的机器上运行,要么就是你有防火墙
protected override void OnClosed(EventArgs e) {
base.OnClosed(e);
server.Dispose();
}