寫一個小型的,只有接收和發送消息的HTTP伺服器

寫一個小型的,只有接收和發送消息的HTTP服務器

有時候我們要寫通信模塊,寫完之後總要測測通不通吧。我不知道別人是怎麼做的,但是我自己覺得,要不寫個小型服務器(程序?),只能接收和發送消息就行了,於是就上網翻了下,好像並沒有現成的代碼(嘆氣),還是自己寫一個吧。

HTTP也是Tcp通信,上篇文章的Tcp服務器端其實拿過來用就行了,只是出了點小問題導致無法正常返回,所以寫下來記錄一下,希望以後更細心,別再犯類似錯誤。

寫一個小型的,只有接收和發送消息的HTTP服務器


  1. using System;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using System.Text;
  8. namespace TestServer
  9. {
  10. public class MyHttpServer
  11. {
  12. string ip;
  13. int port;
  14. TcpListener listener;
  15. StreamWriter outStream;
  16. TcpClient remoteClient;
  17. NetworkStream ClientStream;
  18. public MyHttpServer(string inip,int inport)
  19. {
  20. ip = inip;
  21. port = inport;
  22. }
  23. public void listen()
  24. {
  25. listener = new TcpListener(IPAddress.Parse(ip),port);
  26. listener.Start();
  27. Console.WriteLine("監聽啟動!");
  28. byte[] buffer = new byte[1024];
  29. while (true)
  30. {
  31. try
  32. {
  33. remoteClient = listener.AcceptTcpClient();//阻塞
  34. Console.WriteLine("有客戶端進入!");
  35. ClientStream = remoteClient.GetStream();
  36. int byteRead = ClientStream.Read(buffer, 0, 1024);
  37. if (byteRead == 0)
  38. {
  39. Console.WriteLine("沒東西啊!!");
  40. continue;
  41. }
  42. string msg = Encoding.UTF8.GetString(buffer, 0, byteRead);
  43. Console.WriteLine("接收數據:" + msg);
  44. string head = "";
  45. char [] charArray = Encoding.UTF8.GetChars(buffer);
  46. int i = 0;
  47. while(!charArray[i].Equals(' '))
  48. {
  49. head += charArray[i];
  50. ++i;
  51. }
  52. Console.WriteLine(head);
  53. switch (head)
  54. {
  55. case "POST":
  56. {
  57. string msg2 = "這是POST方法";
  58. byte[] buffer2 = Encoding.UTF8.GetBytes(msg2);//將字符串轉化為二進制
  59. ClientStream.Write(buffer2, 0, buffer2.Length);//將轉換好的二進制數據寫入流中併發送
  60. remoteClient.Close();//問題就出在這裡,一定要關閉
  61. }
  62. break;
  63. case "GET":
  64. {
  65. string msg2 = "這是GET方法";
  66. byte[] buffer2 = Encoding.UTF8.GetBytes(msg2);
  67. ClientStream.Write(buffer2, 0, buffer2.Length);
  68. remoteClient.Close();//問題就出在這裡,一定要關閉
  69. }
  70. break;
  71. }
  72. }
  73. catch (Exception ex)
  74. {
  75. Console.WriteLine("異常:" + ex.Message);
  76. break;
  77. }
  78. };
  79. }
  80. }
  81. class Program
  82. {
  83. static void Main(string[] args)
  84. {
  85. Console.WriteLine("Hello World!");
  86. Console.WriteLine("---------------------------------------");
  87. MyHttpServer server = new MyHttpServer("127.0.0.1",8080);
  88. Thread thread = new Thread(new ThreadStart(server.listen));
  89. thread.Start();
  90. }
  91. }
  92. }

remoteClient.Close();就因為這裡沒寫,客戶端發的消息能收到,但是一直得不到反饋,而客戶端打開的情況下,退出服務端,客戶端才會接受到反饋,當然,是空的。

以後要多加註意,Tcp是連接性的通訊,服務端接受消息後如果不手動關閉連接,系統默認為連接並未斷開,也就不會將消息返回。

另外,話說我明明是做C++的,怎麼貼的都是C#代碼,emmmmm.....

寫一個小型的,只有接收和發送消息的HTTP服務器


分享到:


相關文章: