2014-08-27 5 views
1

저는이 작업에 익숙하지 않습니다. 단지 콘솔 서버 창에서 클라이언트로 메시지를 보내려고합니다.() 위의 내가 client.Send를 사용할 때byte []를 서버에서 클라이언트로 계속 전송 하시겠습니까?

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

그것은 잘 작동하지만 내가 다른 쪽 끝에서 아무것도받지 아래에 다음과 같이 내가 할 때 때

여기 내 서버입니다. 클라이언트가 연결 되었기 때문에 실패한 이유는 없습니다.

    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

을 닫을 때 처분 전화? "보낼 데이터 없음"이라고 쓰여 있습니까? ? 또는...? 참고 : 수신 코드는 엄청나게 무너졌습니다. TCP 데이터는 일반적으로 스트림입니다. 전송 된 좋은 청크에서 항상 "수신"하지는 않습니다. 당신은 읽은 바이트의 수를 알려주는'Receive'의 반환 값을 검사해야합니다 (이것은 전체 메시지 일 필요는 없으며, 단일 바이트 일 수도 있고 27 개의 메시지 일 수도 있습니다) –

+0

: do you 소켓에 'NoDelay'가 활성화되어 있습니까? –

+0

TCP 소켓 자습서를 읽으십시오. 여기에 몇 가지 일반적인 실수. – usr

답변

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

참고 일 듯 몇 가지 테스트 클라이언트 코드를 작성 재사용 할 수 있도록 패킷을 읽을 때마다 클라이언트 연결을 끊고 전에 정적을 null로 설정 한 다음 을 null로 설정하면이 될 것이므로 반입은 한 번만 수행되므로 수행하지 마십시오! 또한 Mark가 말했듯이, Received 호출에서 읽은 바이트 수를 확인하면 디코딩 할 바이트 수를 알 수 있습니다.

+0

코드를 테스트 할 때 연결이 거부되었습니다. System.Net.Sockets.SocketException (0x80004005) : 연결이 거부되었습니다 –

+0

@ BohaoLI 서버가 실행되고 있지 않거나, 다른 포트에서 실행 중이며, 다른 시스템에서 실행 중이거나 방화벽이있는 것 같습니다. –

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

을하고 창을 당신의`btn_Fetch_Click`에 어떻게됩니까

protected override void OnClosed(EventArgs e) { 
    base.OnClosed(e); 
    server.Dispose(); 
} 
관련 문제