/ / Pisanie / czytanie ciągu przez NetworkStream (gniazda) na czacie - c #, ciąg, gniazda, czat, strumień sieciowy

Zapisywanie / odczytywanie ciągów za pośrednictwem NetworkStream (gniazd) dla czatu - c #, string, socket, chat, networkstream

Przepraszamy, jeśli jest to trudne do zrozumienia, wypróbowanie C # po raz pierwszy.

Próbuję zrobić prosty publiczny „czat”między klientami podłączonymi do serwera. Próbowałem przekazać liczby całkowite do serwera i wydrukować je i wszystko było w porządku, jednak po przełączeniu na łańcuchy wydaje się, że może przekazać tylko 1 znak (z powodu ns.Write(converted, 0, 1);). Jeśli zwiększę ns.Napisz do ns.Write(converted,0,10) wszystko ulega awarii (zarówno klient, jak i serwer), gdy wprowadzam wiadomość o długości mniejszej niż 10 znaków.

Kod serwera:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;


namespace MultiServeris
{
class Multiserveris
{
static void Main(string[] args)
{
TcpListener ServerSocket = new TcpListener(1000);
ServerSocket.Start();
Console.WriteLine("Server started");
while (true)
{
TcpClient clientSocket = ServerSocket.AcceptTcpClient();
handleClient client = new handleClient();
client.startClient(clientSocket);
}
}
}

public class handleClient
{
TcpClient clientSocket;
public void startClient(TcpClient inClientSocket)
{
this.clientSocket = inClientSocket;
Thread ctThread = new Thread(Chat);
ctThread.Start();
}
private void Chat()
{
byte[] buffer = new byte[10];
while (true)
{
NetworkStream ns = clientSocket.GetStream();
ns.Read(buffer,0,1);
string line = Encoding.UTF8.GetString(buffer);
Console.WriteLine(line);
}
}
}
}

Kod klienta:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;

namespace Klientas
{
class Klientas
{
static void Main(string[] args)
{
while (true)
{
TcpClient clientSocket = new TcpClient("localhost", 1000);
NetworkStream ns = clientSocket.GetStream();
byte[] buffer = new byte[10];
string str = Console.ReadLine();
byte[] converted = System.Text.Encoding.UTF8.GetBytes(str);
ns.Write(converted, 0, 1);
}
}
}
}

Odpowiedzi:

8 dla odpowiedzi № 1

Najlepiej jest używać klas BinaryReader / BinaryWriter do prawidłowego formatowania i odczytu danych. Eliminuje to potrzebę samodzielnego przetwarzania. Na przykład w kliencie wykonaj:

BinaryWriter writer = new BinaryWriter(clientSocket.GetStream());
writer.Write(str);

I na serwerze:

BinaryReader reader = new BinaryReader(clientSocket.GetStream());
Console.WriteLine(reader.ReadString());

3 dla odpowiedzi № 2

Jeśli używasz BinaryReader lub BinaryWriter w tym samym strumieniu, a masz .NET Framework w wersji 4.5 lub nowszej, pamiętaj, aby pozostawić otwarty strumień bazowy, używając przeciążenia:

using (var w = new BinaryWriter(stream, Encoding.UTF8, true)) {}