2014-08-27 86 views
1

我对此很新,我只想从我的控制台服务器窗口向客户端发送消息。不断从服务器发送字节[]到客户端?

这里是我的服务器:

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."); 
     } 
    } 

} 
+0

在'btn_Fetch_Click'会发生什么处分?它是否写入“无数据要发送”。 ?要么...?注意:接收代码非常可怕地破碎; TCP数据通常是一个流 - 你并不总是在收到它们的好方便的块中“接收”你应该检查'Receive'的返回值,它告诉你它读取的字节数(这不需要是一个完整的消息;它可能是一个字节,它可能是27个消息) – 2014-08-27 15:17:46

+0

也是:你在套接字上启用了'NoDelay'? – 2014-08-27 15:18:39

+0

请阅读TCP套接字教程。这里有些常见的错误。 – usr 2014-08-27 17:58:56

回答

1

嗯,我已经运行服务器代码。没有问题那里...

对于客户端,它似乎你处置的服务器,这会降低连接?和NULL缓冲区,所以你不能再使用,要么....

我写这似乎做工精细

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)); 
     } 
    } 
} 

注意,这点你不”一些测试客户端代码t每次读取数据包时都要断开客户端连接,如果您之前将静态数据清空,然后检查空数值它将为空,因此只能使用一次,因此不要这么做! 也如Mark所说,检查从接收的调用中读取的字节数,以便可以知道要解码多少个字节。

+0

连接被拒绝。 System.Net.Sockets.SocketException(0x80004005):拒绝连接 – 2017-11-24 08:36:59

+0

@BohaoLI我猜想服务器没有运行,运行在不同的端口上,运行在不同的机器上,或者你有防火墙 – 2017-11-24 08:49:18

0

变化

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."); 
    } 
} 

要..

private void btn_Fetch_Click(object sender, RoutedEventArgs e) 
{ 
    if (buffer != null) 
    { 
     server.Receive(buffer); 
     txt_Log.AppendText(System.Text.Encoding.Default.GetString(buffer)); 
     buffer = null; 
    } 
    else 
    { 
     txt_Log.AppendText("\nNo data to send."); 
    } 
} 

和打电话的时候关闭窗口

protected override void OnClosed(EventArgs e) { 
    base.OnClosed(e); 
    server.Dispose(); 
} 
相关问题