asp.net 用socket接收数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 用socket接收数据相关的知识,希望对你有一定的参考价值。

知道IP,知道对方端口号,需要通过socket 用TCP方式发送一组数据到对方电脑并接收到返回数据(确信对电脑会返回数据)。
请帮忙写一个接收的程序,asp.net C#的。
谢谢大家了。

参考技术A client
int port = 8080;
string host = "192.168.1.206";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
Response.Write("Conneting...\n");
c.Connect(ipe);//连接到服务器
string sendStr = " hello!This is a socket test ";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "Send Message ";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Response.Write("Client Get Message:" + recvStr );//显示服务器返回信息
c.Close();

server

string portNo = ConfigurationManager.AppSettings["PortNo"];
IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, int.Parse(portNo));
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] byteMessage = new byte[100];
try

socket.Bind(iep);

catch (Exception ex)

throw ex;

while (flag)

try

socket.Listen(1);
Socket newSocket = socket.Accept();
newSocket.Receive(byteMessage);
string sTime = DateTime.Now.ToShortTimeString();
string msg = sTime + ":" + "Message from:";
msg += newSocket.RemoteEndPoint.ToString() + Encoding.Default.GetString(byteMessage);
byte[] bs = Encoding.ASCII.GetBytes(msg);
newSocket.Send(bs);

catch (SocketException ex)

throw ex;

本回答被提问者采纳
参考技术B 这个应该不会有人白写吧,楼主碰碰运气吧。 参考技术C 举个例

对象名称: SocketObj

* 功能说明: 远程发送与接收

* 试用示例:

* using EC; //引用空间名

* string url = "218.75.111.74"; // URL也可以是(www.baidu.com)这种形式

* int port = 8000; //端口

* string SendStr = "domainname\n"; //组织要发送的字符串

* SendStr += "check\n";

* SendStr += "entityname:domains\n";

* SendStr += "domainname:" + this.TextBox1.Text + "\n";

* SendStr += ".\n";

* EBSocketObj o = new SocketObj(); //创建新对象

* o.Connection(url, port); //打开远程端口

* o.Send(SendStr); //发送数据

* Response.Write(o.Recev()); //接收数据

* o.Dispose(); //销毁对象

**********************************************/

using System;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Text;

namespace EC



/// <summary>

/// Socket 远程发送与接收

/// </summary>

public class SocketObj



private NetworkStream ns;

private bool _alreadyDispose = false;

#region 构造与释构

public EBSocketObj()



//

// TODO: 在此处添加构造函数逻辑

//



public EBSocketObj(string url, int port)



Connection(url, port);



~EBSocketObj()



Dispose();



protected virtual void Dispose(bool isDisposing)



if (_alreadyDispose) return;

if (isDisposing)



if (ns != null)



try



ns.Close();



catch (Exception E)

ns.Dispose();





_alreadyDispose = true;



#endregion

#region IDisposable 成员

public void Dispose()



Dispose(true);

GC.SuppressFinalize(this);



#endregion

#region 打开端口

/// <summary>

/// 打开端口

/// </summary>

/// <param name="url">URL或者:IP地址</param>

/// <param name="port"></param>

/// <returns></returns>

public virtual void Connection(string url, int port)



if (url == null || url == "") return;

if (port < 0) return;

if (port.ToString()==string.Empty) port = 80;

TcpClient tcp = null;

try



tcp = new TcpClient(url, port);



catch (Exception E)



throw new Exception("Can't connection:" + url);



this.ns = tcp.GetStream();



#endregion

#region 发送Socket

/// <summary>

/// 发送Socket

/// </summary>

/// <param name="ns"></param>

/// <param name="message"></param>

/// <returns></returns>

public virtual bool Send(string message)



if (ns == null) return false;

if (message == null || message == "") return false;

byte[] buf = Encoding.ASCII.GetBytes(message);

try



ns.Write(buf, 0, buf.Length);



catch (Exception E)



throw new Exception("Send Date Fail!");



return true;



#endregion

#region 收取信息

/// <summary>

/// 收取信息

/// </summary>

/// <param name="ns"></param>

/// <returns></returns>

public string Recev()



if (ns == null) return null;

byte[] buf = new byte[4096];

int length = 0;

try



length = ns.Read(buf, 0, buf.Length);



catch (Exception E)



throw new Exception("Receive data fail!");



return Encoding.ASCII.GetString(buf, 0, length);



#endregion

ASP.NET Core 使用 Web Socket

WebSocket:

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

基本使用:

在.NET 中,提供了websocket 的支持,在System.Net.WebSockets命名空间下,提供websocket支持。也有WebSocket4Net这样的进一步封装的nuget包。这里我们使用.net 默认提供的WebSockets命名空间。
新建ASP.NET Core web api项目,并添加如下代码。
startup代码

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();
    // 启用websocket中间件
    app.UseWebSockets();
    app.UseEndpoints(endpoints =>
                     
                         endpoints.MapControllers();
                     );

        

服务器端controller代码

namespace WebSocketTest1.Controllers

    [ApiController]
    [Route("[controller]")]
    public class WebSocketController : ControllerBase
    
        [HttpGet("/ws")]
        public async Task Get()
        
            // 判断是否是 websocket 协议的请求
            if (HttpContext.WebSockets.IsWebSocketRequest)
            
                // 如果是 websocket 协议的请求,则获取到当前的 websocket 请求
                using var websocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                // websocket 建立完成,就执行定义的方法,该方法进行收发信息的逻辑代码
                await Echo(websocket);
            
            else
            
                // 如果不是websocket协议的请求,返回400
                HttpContext.Response.StatusCode = 400;
            
        

        [HttpGet("/test")]
        public IActionResult Test()
        
            return Ok("test");
        
        /// <summary>
        /// 收发信息
        /// </summary>
        /// <param name="webSocket"></param>
        /// <returns></returns>
        private static async Task Echo(WebSocket webSocket)
        
            // 接受信息的数组
            var buffer = new byte[1024 * 4];
            // 接受客户端消息
            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            // 如果客户端没有关闭,一切正常没有异常,就保持和客户端的连接,正常收发
            while (!result.CloseStatus.HasValue)
               
                // 解析客户端发送的消息,并且定义返回到客户端的消息,生产byte数组
                var serverMsg = Encoding.UTF8.GetBytes($"Server: Hello. You said: Encoding.UTF8.GetString(buffer)");
                // 将消息发送到客户端
                await webSocket.SendAsync(new ArraySegment<byte>(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
                // 再次接收客户端的消息
                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            
            // 客户端出现异常了,则服务器可以关闭连接了
            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        
    

客户端可以直接在浏览器console控制台
let webSocket = newWebSocket(wss://localhost:端口号/ws);
验证连接

以上是关于asp.net 用socket接收数据的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net中怎么接收post方式提交过来的数据?

python用socket 接收数据问题?

django

CORS 错误,无法从 asp.net 核心后端接收数据

用socket发送接收数据,但每次接收的数据字节长度都大于发送的25个字节?

ASP.NET API(MVC) 对APP接口(Json格式)接收数据与返回数据的统一管理