michal.kolasinski
6/4/2007 12:38:00 PM
Witam. Potrzebuje pomocy przy aplikacji sieciowej w C#. Mam programy
które wykorzystuja protokól TCP/IP do przesylania plików. Jeden
program to klient a drugi serwer. Po przeslaniu pliku przez klienta
serwer zapisuje jego zawartosc w pliku o z góry narzuconej nazwie.
Chodzi o to aby serwer zapisal plik o takiej samej nazwie jaka wyslal
klient.
Kod aplikacji Klienta:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace TCP_Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnBrowse_Click(object sender, EventArgs e)
{
// Wywolanie okna dialogowego sluzacego do wskazania pliku
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.ShowDialog();
tbFilename.Text = openFileDialog1.FileName;
}
private void btnSend_Click(object sender, EventArgs e)
{
Stream fileStream = File.OpenRead(tbFilename.Text);
// Alokacja pamieci dla pliku
byte[] fileBuffer = new byte[fileStream.Length];
fileStream.Read(fileBuffer, 0, (int)fileStream.Length);
// Otwarcie polaczenia TCP/IP i wyslanie pliku
TcpClient clientSocket = new TcpClient(tbServer.Text,
8080);
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Write(fileBuffer, 0,
fileBuffer.GetLength(0));
networkStream.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Kod aplikacji serwera:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace TCP_Server
{
public partial class Form1 : Form
{
private System.Collections.ArrayList alSockets;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Form1.CheckForIllegalCrossThreadCalls = false;
IPHostEntry IPHost = Dns.GetHostByName(Dns.GetHostName());
lblStatus.Text = "Mój adres IP: " +
IPHost.AddressList[0].ToString();
alSockets = new System.Collections.ArrayList();
Thread thdListener = new Thread(new
ThreadStart(listenerThread));
thdListener.Start();
}
public void listenerThread()
{
// Uruchomienie polaczenia TCP
TcpListener tcpListener = new TcpListener(IPAddress.Any,
8080);
tcpListener.Start();
while (true)
{
Socket handlerSocket = tcpListener.AcceptSocket();
if (handlerSocket.Connected)
{
lbConnections.Items.Add(handlerSocket.RemoteEndPoint.ToString() + "
polaczony.");
lock (this)
{
alSockets.Add(handlerSocket);
}
ThreadStart thdstHandler = new
ThreadStart(handlerThread);
Thread thdHandler = new Thread(thdstHandler);
thdHandler.Start();
}
}
}
public void handlerThread()
{
Socket handlerSocket = (Socket)alSockets[alSockets.Count -
1];
NetworkStream networkStream = new
NetworkStream(handlerSocket);
int thisRead = 0;
int blockSize = 1024;
Byte[] dataByte = new Byte[blockSize];
lock (this)
{
// Tylko jeden proces moze miec dostep
// do tego samego pliku w okreslonym czasie
Stream fileStream;
fileStream = File.Open("c:\\cwiczenie\\upload.txt",
FileMode.Truncate);
while (true)
{
thisRead = networkStream.Read(dataByte, 0,
blockSize);
fileStream.Write(dataByte, 0, thisRead);
if (thisRead == 0) break;
}
fileStream.Close();
}
lbConnections.Items.Add("Plik zostal zapisany");
handlerSocket = null;
}
}
}