Вы делаете некоторые интересные вещи с IP-адресами и семействами адресов, которые я не считаю необходимыми - вы (вероятно) хотите, чтобы ваш сервер прослушивал все IP-адреса, как IPv4, так и IPv6.
Когда вы создаете MemoryStream из своего байтового массива, он всегда будет иметь длину 1024 * 10000, и это может привести к путанице в Image.FromStream, поскольку остальная часть изображения будет заполнена нулями.
ВотМой снимок на клиенте, который отправляет изображения (+ имена файлов) на сервер, который сохраняет изображения в папке. Я использую TcpClient
+ TcpListener
вместо более общего класса Socket.
Код сервера:
class Program
{
const int LISTENING_PORT = 10001;
const string IMAGE_DIR = @"C:\Users\joehoper\Desktop\imgservtest\server\";
const int BUFFER_SIZE = 10240;
static void Main(string[] args)
{
var listener = new TcpListener(IPAddress.Any, LISTENING_PORT);
listener.Start();
Console.WriteLine($"Listening on port {LISTENING_PORT}...");
while (true)
{
var client = listener.AcceptTcpClient();
Console.WriteLine($"Accepted client {client.Client.RemoteEndPoint}");
ThreadPool.QueueUserWorkItem(cb => ClientThread(client));
}
}
static void ClientThread(TcpClient client)
{
try
{
using (var stream = client.GetStream())
{
// Read filename length
int fNameLen = stream.ReadByte();
byte[] fNameBytes = new byte[fNameLen];
// Read filename
stream.Read(fNameBytes, 0, fNameLen);
string fName = Encoding.Unicode.GetString(fNameBytes);
using (var fs = File.OpenWrite(IMAGE_DIR + fName))
{
byte[] buffer = new byte[BUFFER_SIZE];
while (true)
{
int r = stream.Read(buffer, 0, BUFFER_SIZE);
if (r == 0)
break;
fs.Write(buffer, 0, r);
}
}
}
}
finally
{
client.Close();
}
}
}
Код клиента:
class Program
{
const string IMAGE_DIR = @"C:\Users\joehoper\Desktop\imgservtest\client\";
const int CONNECT_PORT = 10001;
const int BUFFER_SIZE = 10240;
static void Main(string[] args)
{
Console.WriteLine("Press enter to start sending...");
Console.ReadLine();
foreach (string filename in Directory.GetFiles(IMAGE_DIR))
SendImage(filename);
}
static void SendImage(string filename)
{
var client = new TcpClient("localhost", CONNECT_PORT);
using (var cs = client.GetStream())
{
// Send filename
byte[] fNameBytes = Encoding.Unicode.GetBytes(Path.GetFileName(filename));
cs.WriteByte((byte)fNameBytes.Length);
cs.Write(fNameBytes, 0, fNameBytes.Length);
using (var fs = File.OpenRead(filename))
{
// Send image data
byte[] buffer = new byte[BUFFER_SIZE];
while (true)
{
int r = fs.Read(buffer, 0, BUFFER_SIZE);
if (r == 0)
break;
cs.Write(buffer, 0, r);
}
}
}
client.Close();
}
}