使用Socket作为服务器,接收HTTP请求,在Socket socket = socketListen.Accept();之后启动一个线程处理接收数据
和发送数据,如果不调用socket.Receive(data);接收客户数据的话,那么客户端(也就是HTTP请求)请求多少次,
服务端的Socket socket = socketListen.Accept();就会被调用多少次,就是能百分百接收到客户端请求,
但是通过socket.Send(head)作为HTTP请求返回数据,HTTP请求那边几乎获取不到返回的数据,
偶尔还是能获取到的,相反,不调用socket.Receive(data);方法,就会出现 比如 HTTP请求了100次, socketListen.Accept();可能就被执行了80次,但是这80次调用socket.Send(head)返回给http的数据,http那边都能获取到服务端返回的数据,注:客户端每次发送的数据很少,代码如下public partial class MainWindow : Window
{
private Socket socketWatch;
private Thread listenThread = null;
private bool isRun = false;
private int pointer = 0;
public MainWindow()
{
InitializeComponent();
init();
}
private void init()
{
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80));
socketWatch.Listen(10); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的
listenThread = new Thread(new ParameterizedThreadStart(run));
listenThread.IsBackground = true;
}
private void run(Object o)
{
Socket socketListen = (Socket)o;
while (isRun)
{
Socket socket = socketListen.Accept();
pointer = pointer + 1;
Thread thread = new Thread(new ParameterizedThreadStart(task));
thread.IsBackground = true;
thread.Start(socket);
}
}
private void bn_start_Click(object sender, RoutedEventArgs e)
{
isRun = true;
bn_start.IsEnabled = false;
bn_stop.IsEnabled = true;
listenThread.Start(socketWatch);
}
private void bn_stop_Click(object sender, RoutedEventArgs e)
{
System.Environment.Exit(0);
}
private void Window_Closed(object sender, EventArgs e)
{
System.Environment.Exit(0);
}
private void task(object o)
{
Socket socket = (Socket)o;
byte[] data = new byte[1024 * 2]; // 浏览器发来的数据
int reciverNumber = socket.Receive(data);
string resdata = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " server request time:" + pointer;
byte[] body = Encoding.UTF8.GetBytes(resdata);
byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK
Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + string.Format("{0:R}", DateTime.Now) + @"
Server: Cftea Web Server
" + resdata);
socket.Send(head);
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}