标签: tcpclient

C# - 为什么关闭 NetworkStream 会断开 TcpClient 的连接?

在 中C#,如果我关闭NetworkStream从 实例化的TCPClient.GetStream(),它会断开我的 TCP 客户端的连接。

以这段代码为例:

TcpClient tcpClient = new();
IPEndPoint ipEndPoint = new(IPAddress.Parse("xxx.xxx.xx.xx"), 1026);
tcpClient.Connect(ipEndPoint);

Console.WriteLine($"Before open stream: tcpClient.Connected == {tcpClient.Connected}");

NetworkStream stream = tcpClient.GetStream();
Console.WriteLine($"After get stream: tcpClient.Connected == {tcpClient.Connected}");

stream.Close();
Console.WriteLine($"After close stream: tcpClient.Connected == {tcpClient.Connected}");

tcpClient.Close();
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我这个结果:

Before open stream: tcpClient.Connected == True
After get stream: tcpClient.Connected == True
After close stream: tcpClient.Connected == False
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么会发生这种情况吗?或者也许(对于傻瓜)解释一下TcpClient和 它NetworkStream是如何相关的,以便这应该以这种方式工作?

.net c# tcpclient

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

如何在VB.NET中获取ASCII字符串的长度(即字符数)?

我正在使用此代码从tcpclient返回一些字符串,但是当字符串返回时,它有一个前导"字符.我正在尝试删除它,但Len()函数是读取字节数而不是字符串本身.我怎么能改变这个来给我字符串的长度,就像我通常使用它而不是字符串本身的数组?

 Dim bytes(tcpClient.ReceiveBufferSize) As Byte
 networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

 ' Output the data received from the host to the console.'
 Dim returndata As String = Encoding.ASCII.GetString(bytes)

 Dim LL As Int32 = Len(returndata)
Run Code Online (Sandbox Code Playgroud)

Len() 报告字节数而不是字符串中的字符数.

vb.net string ascii tcpclient

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

在为Node.JS编写的非常低级别的TCP Server上进行身份验证?

如何在为Node.JS编写的TCP服务器中实现类似于HTTP Basic身份验证的内容?基本TCP服务器的代码如下:

// Load the net module to create a tcp server.
var net = require('net');

// Setup a tcp server
var server = net.createServer(function (socket) {

  // Every time someone connects, tell them hello and then close the connection.
  socket.addListener("connect", function () {
    console.log("Connection from " + socket.remoteAddress);
    socket.end("Hello World\n");
  });

});

// Fire up the server bound to port 7000 on localhost
server.listen(7000, "localhost");

// Put a friendly message on the terminal
console.log("TCP server listening on port 7000 …
Run Code Online (Sandbox Code Playgroud)

authentication tcp tcpclient node.js

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

可可,免费桥接和ARC

我想做一个简单的TCP客户端.但我收到一个错误.当我做 inputStream = (NSInputStream *)readStream;,outputStream = (NSOutputStream *)writeStream;它建议我引入前缀__bridge或_ bridge _transfer.

首先,它是什么?第二,我试过两个,仍然无法发送消息.我按照本教程,我也发送了消息和流.我安装了Wireshark并且已经调用了send消息,但它没有向ip发送任何数据包.

我刚刚在这里发布了initNetworkCommunication,因为我收到了"网桥"错误.

- (void) initNetworkCommunication {

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"54.xxx.xxx.xxx", 1333, &readStream, &writeStream);

    inputStream = (NSInputStream *)readStream;
    outputStream = (NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

}
Run Code Online (Sandbox Code Playgroud)

服务器很好,因为我已经尝试了示例代码,我收到了回复.

你能帮助我吗?

cocoa inputstream objective-c stream tcpclient

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

服务器程序即使不使用也会占用大量CPU

我有一个客户端/服务器java游戏我正在努力.有一堆代码,我试图尽可能少地粘贴,同时仍然提供足够的.

当我第一次启动服务器时,它不需要CPU.当我的第一个游戏客户端连接时,它会跳到25%(这似乎相当高,但这不是我主要关注的问题).问题是,即使客户端断开连接,服务器应用程序的CPU使用率仍保持在25%.

服务器从客户端获取名称,并不断从播放器接收x,y坐标.

这是我的实际服务器的代码,在服务器启动后运行:(我事先为过度缩进道歉)

 TCPServer(int port) {
                try
                {
                        tcpSock = new ServerSocket(port);
                        int z = 0;
                        while(true)
                        {
                                Socket sock = tcpSock.accept();
                                sock.setKeepAlive(true);  
                                clientList.addElement(new TcpClient(sock));
                                clientList.get(z).cr.start();
                                clientList.get(z).cw.start();
                                clientList.get(z).packs.addElement("?");
                                while(!clientList.get(z).cr.nameRecieved)
                                {
                                //do nothing untill client has provided it's name
                                }
                                playerList.addElement(new player(sock.getInetAddress(), clientList.get(z).cr.playerName));                                     
                                playerList.get(z).id=z;
                                playerList.get(z).name=clientList.get(z).cr.playerName;
                                clientList.get(z).packs.addElement("2 " + z);
                                for(int j =0; j<playerList.size();j++)
                                    {
                                   String status;
                                   if(playerList.get(j).Connected)
                                       status = "1";
                                   else
                                       status = "0";

                                        addToQueue("3 " + playerList.get(j).id + " "
                                                + playerList.get(j).name + " " + playerList.get(j).x + …
Run Code Online (Sandbox Code Playgroud)

java sockets performance tcp tcpclient

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

C#Gameserver架构

我想知道如何写一个"好"的游戏服务器.我有一些想法,但我从来没有制作过服务器,我不想最终编写brainfuck代码.

我知道如何处理TCP-Connections等但我的问题是如何在服务器和客户端之间进行通信.

例如:我写了一个类似TicTacTow的游戏.现在用户点击了一个单元格,我想告诉该服务器.服务器应验证用户是否可以单击该单元并告知客户端.如果服务器说是; 您可以单击客户端将其显示为"X".

现在我的问题:我如何告诉服务器我想要点击该字段.我在这里遇到了另一个问题,他们最终使用了命令模式.但如果我理解正确,我将不得不创建一个实现接口的命令.我序列化该命令的一个实例并将其发送到服务器.服务器执行命令.但我必须解决主要问题:

  1. 如果该命令将tictacto的单元格设置为X.如何告诉服务器他必须传递GameBoard,我需要将单元格设置为X到接口ICommand的Invoke-Method.
  2. 这不是非常不安全吗?我的意思是我可以编写一个命令来删除我的所有文件或停止服务器并将其发送到服务器.我不相信命令模式是个好主意.

所以我正在寻找更好的东西.我只想为我的客户端和服务器提供一个简单易用的架构.有什么好的模式吗?

哦,还有一个问题:你会使用序列化器吗?或者你自己编码数据?

c# design-patterns tcp tcplistener tcpclient

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

使用TcpClient和Reactive Extensions从Stream读取连续字节流

请考虑以下代码:

internal class Program
{
    private static void Main(string[] args)
    {
        var client = new TcpClient();
        client.ConnectAsync("localhost", 7105).Wait();
        var stream = client.GetStream();
        var observable = stream.ReadDataObservable().Repeat();

        var s = from d in observable.Buffer(4)
                let headerLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(d.ToArray(), 2))
                let b = observable.Take(headerLength)
                select b.ToEnumerable().ToArray();
        s.Subscribe(a => Console.WriteLine("{0}", a));
        Console.ReadLine();
    }
}

public static class Extensions
{
    public static IObservable<byte> ReadDataObservable(this Stream stream)
    {
        return Observable.Defer(async () =>
        {
            var buffer = new byte[1024];
            var readBytes = await stream.ReadAsync(buffer, 0, buffer.Length); …
Run Code Online (Sandbox Code Playgroud)

c# stream tcpclient reactive-programming system.reactive

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

TCP客户端到服务器通信

我正在寻找的是Windows Form VB.Net上的一个简单的TCPClient/Listner示例.我是新手,Microsoft TCPClient/Listner类示例不是我想要的.我正在寻找的是TCPClient发送消息和TCPListener获取消息并发回消息"我收到你的消息"?

一点点帮助会很棒.我有一些代码,但只是发送消息到服务器而不是从服务器回到客户端..任何帮助将非常感谢..

vb.net tcp client-server tcpclient winforms

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

如何在golang中单个TCP连接上同时写入和读取?

我尝试创建一个用于多个写和读并发的sigle TCP连接客户端.例如,TCP Server将像您编写的那样返回值.问题是写和读之间交换的数据.我尝试过sync.Mutex,但它仍然无效.

我的结果是:

2018/03/10 12:52:10 STRING 4:1
2018/03/10 12:52:10 STRING 5:6
2018/03/10 12:52:10 STRING 2:3
and so on
Run Code Online (Sandbox Code Playgroud)

我的期望是:

2018/03/10 12:52:10 STRING 4:4
2018/03/10 12:52:10 STRING 5:5
2018/03/10 12:52:10 STRING 2:2
2018/03/10 12:52:10 STRING 3:3
Run Code Online (Sandbox Code Playgroud)

这是我的代码:package main

import (
    "bufio"
    "log"
    "net"
    "strconv"
    "sync"
    "time"
)

type Cc struct {
    mux sync.Mutex
    rw  *bufio.ReadWriter
}

func main() {
    addr := "127.0.0.1:3333"
    log.Println("Dial " + addr)
    conn, err := net.Dial("tcp", addr)
    cc := Cc{
        rw: bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)),
    }

    if err …
Run Code Online (Sandbox Code Playgroud)

mutex tcpclient go

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

用递归替换while循环

快速简单的问题:

这是:

private static void SetupConnection()
{
    try
    {
        TcpClient client = new TcpClient(myServer, myPort);
        //Do whatever...
    }
    catch (SocketException)
    {
        //Server is closed. Retry in 10 minutes.
        Thread.Sleep(600000);
        SetupConnection();
    }
Run Code Online (Sandbox Code Playgroud)

一个可行的替代方案:

private static void SetupConnection()
{
    while (true)
    {
        try
        {
            TcpClient client = new TcpClient(myServer, myPort);
            //Do whatever...
            break;
        }
        catch (SocketException)
        {
            //Server is closed. Retry in 10 minutes.
            Thread.Sleep(600000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然第二个看起来"更干净",但如果第一个也是可以接受的话,我仍然很好奇 - 如果不是,那么为什么不呢?

c# sockets recursion tcpclient while-loop

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