在 中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是如何相关的,以便这应该以这种方式工作?
我正在使用此代码从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() 报告字节数而不是字符串中的字符数.
如何在为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) 我想做一个简单的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)
服务器很好,因为我已经尝试了示例代码,我收到了回复.
你能帮助我吗?
我有一个客户端/服务器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) 我想知道如何写一个"好"的游戏服务器.我有一些想法,但我从来没有制作过服务器,我不想最终编写brainfuck代码.
我知道如何处理TCP-Connections等但我的问题是如何在服务器和客户端之间进行通信.
例如:我写了一个类似TicTacTow的游戏.现在用户点击了一个单元格,我想告诉该服务器.服务器应验证用户是否可以单击该单元并告知客户端.如果服务器说是; 您可以单击客户端将其显示为"X".
现在我的问题:我如何告诉服务器我想要点击该字段.我在这里遇到了另一个问题,他们最终使用了命令模式.但如果我理解正确,我将不得不创建一个实现接口的命令.我序列化该命令的一个实例并将其发送到服务器.服务器执行命令.但我必须解决主要问题:
所以我正在寻找更好的东西.我只想为我的客户端和服务器提供一个简单易用的架构.有什么好的模式吗?
哦,还有一个问题:你会使用序列化器吗?或者你自己编码数据?
请考虑以下代码:
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) 我正在寻找的是Windows Form VB.Net上的一个简单的TCPClient/Listner示例.我是新手,Microsoft TCPClient/Listner类示例不是我想要的.我正在寻找的是TCPClient发送消息和TCPListener获取消息并发回消息"我收到你的消息"?
一点点帮助会很棒.我有一些代码,但只是发送消息到服务器而不是从服务器回到客户端..任何帮助将非常感谢..
我尝试创建一个用于多个写和读并发的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) 快速简单的问题:
这是:
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)
虽然第二个看起来"更干净",但如果第一个也是可以接受的话,我仍然很好奇 - 如果不是,那么为什么不呢?
tcpclient ×10
c# ×4
tcp ×4
sockets ×2
stream ×2
vb.net ×2
.net ×1
ascii ×1
cocoa ×1
go ×1
inputstream ×1
java ×1
mutex ×1
node.js ×1
objective-c ×1
performance ×1
recursion ×1
string ×1
tcplistener ×1
while-loop ×1
winforms ×1