клиент серверное приложение

Тема в разделе ".NET", создана пользователем met123, 14 май 2007.

  1. met123

    met123 Гость

    есть клиент серверное приложение наподобие аськи.
    собственно первоначальное задание отправка файлов и текстовых сообщений.
    Сервер содержит слушатель который прослушивает опред порт, и как тока появляется клиентский сокет перехватывает его.
    сервер реализован следующим классом:
    [codebox]
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Threading;

    namespace server
    {
    class filenetworkserver
    {

    class clienthandler
    {

    public string ouputfile;
    private const int sizeoffbuffer=10000;
    private Socket socket;
    private byte[] buffer;
    private NetworkStream networkstream;
    private Stream inputstream;
    private Stream outputstream;

    private AsyncCallback callbackread;
    private AsyncCallback callbackwrite;
    private AsyncCallback callbackfile;
    public string filename;
    public Thread savefile;
    //constructor
    public clienthandler (Socket sockeforclient)
    {
    socket=sockeforclient;
    buffer=new byte[sizeoffbuffer];
    networkstream =new NetworkStream (sockeforclient);
    callbackfile =new AsyncCallback (this.OnFileComleteRead);
    callbackread =new AsyncCallback (this.OnComleteRead);
    callbackwrite =new AsyncCallback (this.OnComleteWrite);

    }
    public void savefl()
    {

    Form2 frm = new Form2();
    frm.label1.Text = "You have been taken incoming file: "+filename;

    }
    public void startread()
    {

    networkstream.BeginRead(buffer, 0, buffer.Length, callbackread, null);

    }
    public void proc()
    {
    SaveFileDialog saveFileDialog1 = new SaveFileDialog();

    saveFileDialog1.FileName = filename;
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {

    MessageBox.Show(saveFileDialog1.FileName);

    }
    }
    private void OnComleteRead(IAsyncResult ar)
    {
    int bytesread=networkstream.EndRead(ar);
    if(bytesread >0)
    {
    filename=Encoding.ASCII.GetString(buffer,0,bytesread);
    MessageBox.Show ("openning file"+filename);
    savefile = new Thread(new ThreadStart(savefl));
    savefile.Start();
    savefile.Join();


    inputstream = File.OpenRead(filename);
    outputstream = File.OpenWrite(@"C:\111111.txt");
    inputstream.BeginRead(buffer,0,buffer.Length,callbackfile,null);

    }else
    {
    MessageBox.Show ("read connection drop");
    networkstream.Close();
    socket.Close();
    networkstream =null;
    socket =null;
    }

    }
    private void OnComleteWrite(IAsyncResult asyncresult)
    {
    outputstream.EndWrite(asyncresult);
    inputstream.BeginRead(buffer, 0, buffer.Length, callbackfile, null);

    }

    private void OnFileComleteRead(IAsyncResult asyncresult)
    {
    int bytesread=inputstream.EndRead(asyncresult);
    if (bytesread > 0)
    {
    //MessageBox.Show("schitali byte " + Convert.ToString(bytesread));
    outputstream.BeginWrite(buffer, 0, buffer.Length, callbackwrite, null);
    outputstream.Flush();
    //MessageBox.Show("flush");

    }
    else
    {
    MessageBox.Show("vse potok pust");
    networkstream.Close();
    outputstream.Close();
    inputstream.Close();
    socket.Close();
    networkstream = null;
    socket = null;





    }

    }


    }
    public void stop()
    {

    }

    private void OnComleteListen(Socket skt)
    {
    }

    public void run()
    {


    TcpListener tcplistener = new TcpListener(65000);
    listn = tcplistener;

    tcplistener.Start();

    for (; ; )
    {
    Socket socketforklient = tcplistener.AcceptSocket();

    if (socketforklient.Connected)
    {
    clienthandler handler = new clienthandler(socketforklient);
    handler.startread();

    }
    }
    }
    [/codebox]

    сам сервер визуально состоит из формы: текстового поля для ввода ip адреса чтоб законектиться на другой сервак и кнопочки.
    При запуске сервера сразу создается в новом потоке обьект класса и вызыв метод run() который содержит синхронную ф-цию AcceptSocket() для получения сокета клиента.
    дальше я реализовал в этом классе внутр класс clienthandler, конструктор которого принимает клиентский сокет , и создает для него отдельный поток , буфер.
    посредством метода public void startread() счит оправленная информация от клиента(на данный момент имя файла)
    посредством асинхронной функции BeginRead, после этого вызыв метод OnComleteRead в котором получ имя файла. потом я создаю новый поток, приостанавливая текущий
    [codebox]savefile = new Thread(new ThreadStart(savefl));
    savefile.Start();
    savefile.Join();[/codebox],
    в котором выдаю формочку типа получили такой файл и две кнопочки сохранить и отмена.
    1.Вопрос: если я выбираю сохранить и при попытке вызова диалогового окна выдаеться сообщения

    Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.

    как его обойти?и как потом передать путь для сохранения дальше в функцию?
    2.Вопрос: если я выбираю отмена как мне и с метода который связ с событием нажатия кнопки получить доступ до обьекта до опред обьекта класса clienthandler чтоб остановить поток и не считывать информацию с файла?
    то есть и вообще меня интересует такой вопрос: если я ,например, в методе одного класса (например методе обработч события нажатия на кнопку) создаю обьект своего класса , то как мне потом с другого метода иметь доступ а свойствам этого конкретного обьекта (не статическим)


    Это для начала, помогите если кто знает?
     
  2. mms

    mms Гость

    1. Надо сделать то, что вас просят, поставить STAThread аттрибут методу Main.

    2. Не очень понятно, что значит остановить чтение файла? Когда вы нажимаете кнопку сэйв поидее должен идти запрос на передачу данных, в случае если кнопка сэйв не нажата, запроса не будет и никакой файл читаться не будет.
     
  3. Electro

    Electro Гость

    Как-то и я пытался использовать OLE объект акт-й сервером, результат :
    Вышел из сит-и сл. образом :
    -каждый клиент созд. на серв. свой объект(независимо от др-х)
    -объект акт-й сервером выполняет роль менеджера.
     
Загрузка...

Поделиться этой страницей