【发布时间】:2014-06-30 21:00:33
【问题描述】:
我想要做的只是检查客户端发送的消息。 我想要的是保持创建的套接字打开,并检查客户端不时发送的获取消息。
我只使用System.Net.Sockets,我想基于 barkeley 套接字进行实现。
这是我的代码,
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
namespace Socket_v1._0
{
class Program
{
private const int BUFSIZE = 200;// Size of receive buffer
private const int BACKLOG = 5; // O valor backlog define o número de pedidos de conexão que podem ser mantidos em espera sem serem aceites pela "system-call" accept.
static void Main(string[] args)
{
int servPort = 8070; //port number
Socket server = null;
try
{
// Create a socket to accept client connections
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, servPort));
server.Listen(BACKLOG);
}
catch (SocketException se)
{
Console.WriteLine(se.ErrorCode + ": " + se.Message);
Environment.Exit(se.ErrorCode);
}
//for now the server socket is waiting for connections
byte[] rcvBuffer = new byte[BUFSIZE]; // definir buffer
int bytesRcvd = 0 ; // numero de bytes recebidos
for (; ; )
{ // Run forever, accepting and servicing connections
Socket client = null;
try
{
client = server.Accept(); // Get client connection
Console.Write("Handling client at " + client.RemoteEndPoint + " - ");
do {
bytesRcvd = client.Receive(rcvBuffer, 0, rcvBuffer.Length, SocketFlags.None);
string s = Encoding.ASCII.GetString(rcvBuffer, 0, bytesRcvd);
}while (true);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
client.Close();
}
}
}
}
}
所以客户端不时发送一个http get,我想看看那些消息,
现在这是第一次运行字符串获取 http get,并且因为我保持套接字打开,所以我想等待下一条消息 (do{}(while(true)))。
它返回到 client.receive,然后停止。
在检测到来自客户端的另一条消息后,它进入永久循环并且字符串为空。
我想要类似于聊天的东西,客户端发送消息,服务器显示消息。
那么打开socket后,我应该怎么做才能从客户端获取消息,然后显示它,然后等待另一个消息?
让我烦恼的另一件事是客户端 http get:
这是http获取
GET /iclock/cdata?SN=2182682370001&options=all&pushver=2.1.2&language=80 HTTP/1.1
Host: 192.168.1.43:8070
User-Agent: iClock Proxy/1.09
Connection: close
Accept: * / *
连接关闭是什么意思?每次客户端要发送请求时我都需要创建一个新套接字吗?
试着弄明白,我对代码做了一些更改,虽然我得到了这个
while ((bytesRcvd = client.Receive(rcvBuffer/*, 0, rcvBuffer.Length, SocketFlags.None*/)) > 0)
{
totalBytesEchoed += bytesRcvd;
string s = Encoding.ASCII.GetString(rcvBuffer, 0, bytesRcvd);
Console.WriteLine(s);
}
图片:
所以在图像中我运行了wireshark 和我的控制台应用程序。
根据wireshark,客户端试图发送2个http请求,但根据控制台它只显示一个......
我想显示这两个电话..
几年前,我用c语言做了一些关于套接字的练习。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main(void)
{
struct sockaddr_in me, from;
int newSock, sock = socket(AF_INET, SOCK_STREAM, 0);
int adl = sizeof(me);
char linha[81];
bzero((char *) &me, adl);
me.sin_family = AF_INET;
me.sin_addr.s_addr = htonl(INADDR_ANY ); /* endereco IP local */
me.sin_port = htons(8450); /* porta local */
if (-1 == bind(sock, (struct sockaddr *) &me, adl))
{
close(sock);
puts("Porta ocupada");
exit(1);
}
listen(sock, 5);
newSock = accept(sock, (struct sockaddr *) &from, &adl);
close(sock);
do
{
read(newSock, linha, 81);
puts(linha);
} while (strcmp(linha, "exit"));
close(newSock);
}
这是在c中,所以你可以看到,在接受套接字保持打开状态并且客户端发送消息后,它只会在用户向服务器发送退出时关闭套接字...... 可能有时客户端不发送......但套接字仍然打开,并且当它检测到时
这是我想要实现的示例,使用 system.net.sockets 库,,,
谢谢
【问题讨论】:
-
你可以试试 SignalR,似乎很适合你的需要
-
我可以,但我只想使用套接字库,我知道它需要更多的工作,但这不可能吗?
-
您的代码应该可以工作。它应该显示单个连接的客户端发送的所有内容。您能否更具体地说明您要解决的问题?
-
我添加了一张图片并描述了它...
-
HTTP 默认不使用 keep-alive 连接——每个请求-响应对使用一个新的 TCP 连接(因此是一个新的客户端套接字)。当
Receive方法返回零时,它告诉您连接已关闭。总而言之,除非你想学习很多关于 TCP 和 HTTP 工作原理(以及如何在 C# 中正确处理)的新知识,否则你应该使用更高抽象级别的东西。使用例如HttpListener将为您省去很多麻烦。或者查看 OWIN 以获得成熟的进程内 Web 服务器 :)