2011-10-27 29 views
0

bellow是我的服務器代碼,它運行成功,但小問題是,當我從客戶端發送數據兩次它接受一次。 例如如果我運行此服務器和客戶端也togethor;第一次它接受來自客戶端的數據,第二次當我再次ping從客戶端它不接受數據第三次當我從客戶端ping通它接受數據,第四次當我從客戶端ping它不接受數據,第五次當我從客戶端ping它接受數據,等..... 感謝您在高級。C#服務器socket編程

class Program 
{ 
    //static byte[] Buffer { get; set; } 
    //static Socket sck; 
    static void Main(string[] args) 
    { 
     while (true) 
     { 
      Socket sck; 
      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  ProtocolType.Tcp); 
      sck.Bind(new IPEndPoint(0, 2000)); 
      sck.Listen(10); 
      Socket accepted = sck.Accept(); 
      byte [] Buffer = new byte[accepted.SendBufferSize]; 
      int bytesRead = accepted.Receive(Buffer); 
      byte[] formatted = new byte[30]; 
      for (int i = 0; i < 30; i++) 
      { 
       formatted[i] = Buffer[i]; 
      } 
      string strData = Encoding.ASCII.GetString(formatted); 
      Console.Write(strData + "\r\n"); 
      sck.Close(); 
      accepted.Close(); 
     } 
    } 
} 
+0

對不起,我忘了提,我只需要只從客戶端接收我不想任何種類的信息發送到客戶端的數據。 – user1014212

+0

第二次嘗試是否實際連接到套接字? Socket.Receive可能不會返回任何字節或足夠的字節,您應該檢查實際讀取的字節數的返回值。 – Matt

+0

你有沒有嘗試過代碼,它究竟在哪裏失敗? – Matt

回答

1

這不是你通常如何編寫服務器的代碼。通常情況下,監聽者保持工作並接受新的連接,並在完成時關閉它們。在第二次嘗試時,客戶端可能會在關閉之前連接到舊的偵聽器。嘗試讓偵聽器保持打開狀態,或者在接受連接時立即關閉偵聽器。

+0

);對於第一次ping,它可以工作,但是在控制檯上顯示數據後它在while循環中流動並且出現在一行「sck.Bind(new IPEndPoint(0,2000));」並且給我一個錯誤「通常每個套接字地址(協議/網絡地址/端口)只有一個用法「 – user1014212

+0

正確 - 你必須把聽音器的所有邏輯從你的循環中取出。 –

0

你需要一個TcpListner

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.71).aspx

此外,要處理很多請求,你需要在服務器上不同的線程處理多個請求。你需要一個線程池。看看ThreadPool.QueueUserWorkitem。

下面是使用一個更完整的C#TCP服務器的例子:

http://www.codeproject.com/KB/IP/dotnettcp.aspx

+0

它看起來像是MSDN上的這個工具會工作...謝謝大家在這裏.. :) – user1014212

0

你需要運行服務器到Thread

public void StartListener() 
     { 

      while (true) 
      { 
       mySocket = myListener.AcceptSocket(); 
       Console.WriteLine("\r\nsocket type = {0}", mySocket.SocketType); 
       if (mySocket.Connected) 
       { 
       byte[] receive = new byte[1024]; 
       mySocket.Receive(receive, 1024, 0); 
       string sBuffer = Encoding.ASCII.GetString(receive); 
       } 
      } 
    } 

然後:

 IPAddress IPaddress = Dns.Resolve(Dns.GetHostName()).AddressList[0]; 
     TcpListener myListener = new TcpListener(IPaddress, 50); 
     myListener.Start(); 
     Thread th = new Thread(new ThreadStart(StartListener)); 
     th.Start(); 

更多信息:

TcpListener Class

Thread