写一个小型的,只有接收和发送消息的HTTP服务器

有时候我们要写通信模块,写完之后总要测测通不通吧。我不知道别人是怎么做的,但是我自己觉得,要不写个小型服务器(程序?),只能接收和发送消息就行了,于是就上网翻了下,好像并没有现成的代码(叹气),还是自己写一个吧。

HTTP也是Tcp通信,上篇文章的Tcp服务器端其实拿过来用就行了,只是出了点小问题导致无法正常返回,所以写下来记录一下,希望以后更细心,别再犯类似错误。


  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.....

举报
评论 0