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 № 1Najlepiej 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)) {}