标签: networkstream

使用.NET进行TCP编程

我遇到套接字编程工作的问题.我写了一个TCP客户端,通过套接字/网络流发送命令.我正在使用Wireshark来查看通过电线的原始数据.每次我发送一个"命令"(意思是我刷新()网络流),Wireshark应用程序告诉我TCP标头中的校验和是不正确的(说它应该是0x2440,但是是0x0000).我确实收到了一个ACK我不明白为什么在应用程序层我不得不关心TCP头.这不可能是正确的.有人知道我为什么会得到这个"错误".有没有我不知道的设置我正在使用带有Tcp的.NET 2.0套接字.谢谢.

.net sockets tcp networkstream

1
推荐指数
1
解决办法
557
查看次数

.Net使用Chr()来解析文本

我正在构建一个简单的客户端 - 服务器聊天系统.

客户端将数据发送到服务器,服务器将数据重新发送到所有其他客户端.我正在使用TcpListener和网络流类在客户端和服务器之间发送数据.

我需要发送的字段是,例如:名称,文本,时间戳等.我使用ASCII字符29将它们分开.

我也使用ASCII字符30来标记流数据的结束.

数据用UTF8编码..

这是一个好方法吗?我会遇到问题吗?有更好的方法吗?

更新:

可能我的问题被误解了,所以我更好地解释它.假设有一个从客户端发送到服务器的数据列表,并假设只在一个流中发送所有数据,你如何发送这些数据?

  • 使用标记
  • 使用字符作为分隔符
  • 为每个字段使用固定长度

.net encoding networkstream utf-8 chr

1
推荐指数
1
解决办法
155
查看次数

如何从服务器读取消息?(TCP)

客户端写入服务器 - 服务器读取.和服务器写入客户端 - 客户端未读取.

服务器:

    using System;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;

    class SocketServer
    {

        public static void Main()
        {

            StreamReader streamReader;
            NetworkStream networkStream;

            TcpListener tcpListener = new TcpListener(5555);
            tcpListener.Start();

            Console.WriteLine("The Server has started on port 5555");
            Socket serverSocket = tcpListener.AcceptSocket();

            try
            {
                if (serverSocket.Connected)
                {
                    Console.WriteLine("Client connected");
                    networkStream = new NetworkStream(serverSocket);

                    AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod);
                    AsyncCallback callback = new AsyncCallback(CallbackMethod);
                    asyncDeleg.BeginInvoke(networkStream, callback, asyncDeleg);
                    streamReader = new StreamReader(networkStream);
                    while (true)
                    {
                        Console.WriteLine(streamReader.ReadLine());
                    }

                }

                if …
Run Code Online (Sandbox Code Playgroud)

c# networkstream streamwriter streamreader

1
推荐指数
1
解决办法
1万
查看次数

如何等待流写入完成

我有一个服务器应用程序,它侦听端口8888上的连接.我也在创建客户端应用程序.这是一个简单的应用程序,唯一困难的是管理多个连接.所以我只需要在计算机之间发送文件,所以我这样做的方式,我不知道它是否是怀特,但它的工作原理也许你们可以纠正我.这是发送文件时的算法:

NetworkStream stream = \\ initialize it

while(someCondition)
{
  // first I open the file for reading and read chunks of it
  byte[] chunk = fileRead(file, indexStart, indexEnd) // I have a similar method this is just to illustate my point

  stream.Write(chunk, \\other params)

   // since I often send large files it will be nice if I can wait here 
   // until the stream.Write is done. when debuging this the while loop 
   // executes several times then it waits. 

} …
Run Code Online (Sandbox Code Playgroud)

c# networking networkstream

1
推荐指数
1
解决办法
4044
查看次数

如何安全地结束NetworkStream.Read()?(在C#或VB.net中)

我写了一个类,试图读取服务器发送的字节数据,当我的应用程序结束时,我也希望循环结束,但是NetworkStream.Read()如果没有数据可用,它似乎等待.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Threading.Tasks;
namespace Stream
{
    class Program
    {
        private static TcpClient client = new TcpClient("127.0.0.1", 80);
        private static NetworkStream stream = client.GetStream();

        static void Main(string[] args)
        {
            var p = new Program();
            p.Run();
        }

        void Run()
        {
            ThreadPool.QueueUserWorkItem(x =>
            {
                while (true)
                {
                    stream.Read(new byte[64], 0, 64);
                }
            });

            client.Close();
            // insert Console.ReadLine(); if you want to see an exception occur.
        }
    } …
Run Code Online (Sandbox Code Playgroud)

c# sockets networkstream tcpclient

1
推荐指数
2
解决办法
2万
查看次数

NetworkStream 读取的字节数比预期少

如果 messageBytes.Length 足够大(例如大约 30,000),则 Stream.Read 读取的字节数比预期少。

Using stream As New Net.Sockets.NetworkStream(socket)
    networkStream.Read(messageBytes, 0, messageBytes.Length)
End Using
Run Code Online (Sandbox Code Playgroud)

MSDN 的文档在其备注部分声明了这一点

即使尚未到达流的末尾,实现也可以自由地返回比请求更少的字节。

我能够在 while 循环中读取它,读取单个字节,直到到达所需的位置,例如

Dim position = 0
While position < messageBytes.Length
    stream.Read(messageBytes, position, 1)
    position += 1
End While
Run Code Online (Sandbox Code Playgroud)

问题是任何人都可以说出为什么实施允许这样做吗?我认为该Stream.Read方法是阻塞的,因此它应该等到流中的所有字节都可用并成功读取。

.net vb.net networkstream stream

1
推荐指数
1
解决办法
589
查看次数

ReadAsync 停止代码执行,没有抛出异常并且 Task 仍在运行

所以我用我的 C# 程序使用 TcpClient 类连接到代理服务器。我建立了连接,然后使用 ReadAsync 方法继续从服务器读取到缓冲区中。但是当代理设备断开连接时,看起来 ReadAsync 方法进入了一个循环并且没有进一步的代码被处理。有趣的是,没有抛出异常,任务仍然继续工作(在 Listen() 调用中放置一个等待会阻止进一步执行,即使设备断开连接)。

代码:

        public async Task Listen()
        {
            try
            {
                await server.ConnectAsync(ServerIP, ServerPort);

                if (server.Connected)
                {                    
                    using (NetworkStream stream = server.GetStream())
                    {
                        while (server.Connected)
                        {
                            try
                            {
                                byte[] buffer = new byte[server.ReceiveBufferSize];

                                int length = await stream.ReadAsync(buffer, 0, buffer.Length);
                            }
                            catch(Exception e)
                            {
                                server.Close();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                server.Close();
            }
        }
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何检测设备何时断开连接,以便我可以进一步处理?代理服务器不会关闭,它只是停止发送数据。

.net c# networkstream

1
推荐指数
1
解决办法
45
查看次数

如何将大字符串写入NetworkStream?

从互联网上我得到了从NetworkStream中读取一个巨大字符串的方法.

 static NetworkStream ns = null;
 static StringBuilder sb = null;
 static byte[] buffer = null;
 static int position = 0;
 //.......................................
 //other codes skipped for simplicity
 //....................................... 
 private static string Read()
 {
        if (ns.CanRead)
        {
            sb.Clear();
            position = 0;
            while (ns.DataAvailable)
            {
                position = ns.Read(buffer, 0, buffer.Length);
                sb.Append(Encoding.Unicode.GetString(buffer, 0, position));
            }

            return sb.ToString().Trim();
        }
        else
        {
            return null;
        }
 }
Run Code Online (Sandbox Code Playgroud)

但是,我找不到如何将大字符串写入NetworkStream的示例.

是否有像写作一样的"对称"模式?

先感谢您.

c# sockets networkstream

0
推荐指数
1
解决办法
836
查看次数

在什么条件下NetworkStream不会一次读入所有数据?

在回调中,NetworkStream.BeginRead我似乎注意到始终读取所有字节。我看到许多教程检查BytesRead是否小于总字节,如果是,请再次读取,但是似乎从来没有。

if (bytesRead < totalBytes)即使一次发送大量数据(数千个字符),并且即使缓冲区大小设置为非常小的值(大约16个),该条件也永远不会触发。

我没有使用“老式方式”进行测试,因为我正在使用Task.Factory.FromAsync而不是调用NetworkStream.BeginRead并提供一个我称为EndRead的回调。也许Tasks自动包含了直到读取完所有数据才返回的功能?我不确定。

无论哪种方式,我仍然对何时不能一次读取所有数据感到好奇。甚至需要检查是否未读取所有数据,如果需要,则再次读取?我似乎无法获得有条件运行的条件。

谢谢。

c# android networkstream stream android-asynctask

0
推荐指数
1
解决办法
1587
查看次数

使用TCP在C#中实现FTP客户端

我一直在乱用C#中的TCP套接字,我在与我设置的FTP服务器通信时遇到了一些麻烦.我最初可以连接并获得220消息,但是当我发送"USER nrcrast"命令时,我从未得到响应,并且DataAvailable属性返回false.谁知道我做错了什么?到目前为止,这是我的代码:

namespace TCPClient
{
public partial class TCPClientForm : Form
{


    private TcpClient myClient;
    NetworkStream stream;

    public TCPClientForm()
    {
        InitializeComponent();
        send();

    }

    void send()
    {

        while (true)
        {
            try
            {
                myClient = new TcpClient("nrcrast.dyndns.info", 21);
                break;
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.ToString());
            }

        }
        stream = myClient.GetStream();
        int sendOffset = 0;
        int recOffset=0;

        int dataLength;
        Byte[] receiveData = new Byte[256];


        // wait for a response
        dataLength = stream.Read(receiveData, recOffset, receiveData.Length);
        String recvdMessage = System.Text.Encoding.ASCII.GetString(receiveData, 0, dataLength);
        Console.WriteLine(recvdMessage.ToString());
         recOffset+=dataLength;


        String …
Run Code Online (Sandbox Code Playgroud)

c# ftp tcp networkstream stream

0
推荐指数
1
解决办法
5391
查看次数

为什么在解析完成之前抛出一个流结束?

我不知道为什么这会抛出错误在解析完成之前遇到的流结束.我查看了这个链接,但没有任何内容解决了我的问题.我使用断点来找到它抛出错误女巫的确切点

       Console.WriteLine("Message from client ");
Run Code Online (Sandbox Code Playgroud)

提前致谢

   if (stream.DataAvailable)
   {
       byte[] buffer = new byte[10024];
       int byteCount = stream.Read(buffer, 0, buffer.Length);
       byte[] inBytes = new byte[byteCount];
       for (int counter = 0; counter < byteCount; counter++)
           inBytes[counter] = buffer[counter];
       BinaryFormatter formatter = new BinaryFormatter();
       MemoryStream memory = new MemoryStream();
       memory.Write(inBytes,0,inBytes.Length);
       object message = (object)formatter.Deserialize(memory);
       Console.WriteLine("Message from client ");
       memory.Close();
   }
Run Code Online (Sandbox Code Playgroud)

编辑*这是我的坏事实际代码没有错,我在客户端犯了错误.我使用Encoding.ASCII而不是二进制格式.

c# networkstream stream

0
推荐指数
1
解决办法
3001
查看次数

C#网络流碎片数据

我的背景

我有一个TCP网络程序,它通过连接发送已经序列化并编码到base64的大对象.我写了一个客户端库和一个服务器库,他们都使用NetworkStream's Begin/EndReadBegin/EndWrite.这是我正在使用的代码(非常简化的版本):

对于服务器:

var Server = new TcpServer(/* network stuffs */);
Server.Connect();
Server.OnClientConnect += new ClientConnectEventHandler(Server_OnClientConnect);

void Server_OnClientConnect()
{
    LargeObject obj = CalculateLotsOfBoringStuff();
    Server.Write(obj.SerializeAndEncodeBase64());
}
Run Code Online (Sandbox Code Playgroud)

然后客户:

var Client = new TcpClient(/* more network stuffs */);
Client.Connect();
Client.OnMessageFromServer += new MessageEventHandler(Client_OnMessageFromServer);

void Client_OnMessageFromServer(MessageEventArgs mea)
{
    DoSomethingWithLargeObject(mea.Data.DecodeBase64AndDeserialize());
}
Run Code Online (Sandbox Code Playgroud)

客户端库有一个回调方法,NetworkStream.BeginRead用于触发OnMessageFromServer将数据作为字符串传递的事件MessageEventArgs.

我的问题

BeginRead/EndRead但是,当通过它接收大量数据时,它似乎在多个消息上分散.EG假装这是一条很长的信息:

"This is a really long message except not because it's for explanatory purposes."
Run Code Online (Sandbox Code Playgroud)

如果这确实是一个很长的消息,Client_OnMessageFromServer可能会被称为...说"三条消息"的碎片部分:

"This is a …
Run Code Online (Sandbox Code Playgroud)

c# networkstream fragment beginread

0
推荐指数
1
解决办法
1349
查看次数

StreamReader.Read()是阻塞方法吗?

StreamReader.Read()特别是如果应用到阻塞的方法NetworkStream

c# networkstream streamreader

0
推荐指数
1
解决办法
666
查看次数