Ringkasan artikel:
Delphi sangat kuat. Menulis perangkat lunak dengan Delphi dapat mempersingkat siklus pengembangan perangkat lunak. Artikel ini memperkenalkan cara menggunakan Delphi untuk menulis program transfer file point-to-point.
---------------------------------------------------
Delphi sangat kuat. Menulis perangkat lunak dengan Delphi dapat mempersingkat siklus pengembangan perangkat lunak. Ide dasar transfer file point-to-point adalah bahwa perangkat lunak server dan perangkat lunak klien menggunakan port yang sama. Setelah terhubung, klien mengirimkan permintaan ke server, termasuk nama file, ukuran, dll file yang akan ditransfer. Jika server Menerima dan mulai mentransfer file. Tentu saja, ada dua mode untuk transfer file, kode ASCII dan Bin, namun secara umum Bin sudah cukup. Berdasarkan pembahasan di atas, pada awalnya dimungkinkan untuk menggunakan kontrol NMStrm dan NMStrmServ Delphi4. Namun, saya telah mengujinya dan menemukan bahwa kontrol NMStrm dapat digunakan untuk file yang lebih kecil dan sangat nyaman ), kesalahan akan terjadi. Jadi selanjutnya kita menggunakan TServerSocket dan TClientSocket di Delphi untuk menulis program ini. Karena keterbatasan ukuran paket Ethernet dan mekanisme pemrosesan DelphiSocket (di Delphi, ketika Anda menggunakan Socket untuk mengirim Stream yang lebih besar, penerima akan memicu OnRead beberapa kali. . event, Delphi hanya menjamin integritas setiap data dalam beberapa event OnRead, dan tidak mengumpulkan data itu sendiri dan mengembalikannya ke pengguna, jadi jangan berpikir bahwa Anda dapat mengirim file untuk ditransfer sekali dalam satu Socket dan Recv sekali di tempat lain. . Anda harus mengumpulkan data sendiri atau menentukan protokolnya sendiri), jadi kami mengadopsi metode protokol khusus. Cara kanonik untuk mendefinisikan suatu protokol adalah dengan menggunakan Record End. menyukai:
TMyFilePRotocol=Rekam
sSendType=(ST_QUERY,ST_REFUSE,ST_DATA,ST_ABORT,...);
iPanjang: bilangan bulat;
bufKirim: Buffer;
Akhir;
Saya sudah mencoba metode ini, tetapi gagal, dan saya selalu berpikir bahwa metode saya benar, tetapi program selalu gagal dikompilasi. Saya kira ada yang salah dengan Delphi :) Jadi saya menggunakan metode lain pada contoh program berikut. Ada dua properti, TerimaTeks dan TerimaBuf, di kelas Socket. Dalam event OnRead, kedua properti ini hanya bisa digunakan satu kali, jadi kita bisa menggunakan variabel global untuk menyimpan apakah akan membaca Teks atau Buf, artinya, baca Kirim SMS sekali dan baca lagi.
Mulai programnya:
Tuliskan yang paling sederhana, yang terutama digunakan untuk menjelaskan metode.
Tentukan protokol:
Konstan
MP_QUERY ='1';
MP_REFUSE ='2';
MP_ACCEPT ='3';
MP_NEXTWILLBEDATA='4';
MP_DATA ='5';
MP_ABORT ='6';
MP_OVER ='7';
MP_CHAT ='8';
Pengenalan perjanjian:
Pertama, Klien mengirimkan MP_QUERY, dan setelah menerimanya, Server mengirimkan MP_ACCEPT atau MP_FEFUESE;
Klien mengirimkan MP_FILEPROPERTY setelah menerima MP_ACCEPT, dan Server mengirimkan MP_NEXTWILLBEDATA setelah menerimanya;
Klien mengirimkan MP_NEXTWILLBEDATA setelah menerimanya, dan Server mengirimkan MP_DATA setelah menerimanya;
Klien menerima MP_DATA dan mengirimkan data, Server menerima data dan mengirimkan MP_NEXTWILLBEDATA;
Ulangi hingga Klien mengirimkan MP_OVER;
MP_CHAT+String dapat dikirim satu sama lain di tengah;
Program pelayan:
Tempatkan kontrol berikut:SaveDialog1,btnStartServer,
ss,(TServerSocket)
btnStartServer.OnClick(Pengirim:TObject);
mulai
ss.Pelabuhan:=2000;
ss.Buka;
akhir;
ss.OnClientRead(Pengirim: TObject;Socket: TCustomWinSocket);
var
suhu:string;
bufRecv:Penunjuk;
iRecvLength: bilangan bulat;
mulai
jika bReadText maka
mulai
sTemp:=Socket.ReceiveText;
kasus sTemp[1] dari
MP_QUERY: mulai
//Tolak di sini
SaveDialog1.FileName:=Salin(sTemp,2,Panjang(STemp));
jika SaveDialog1.Execute kemudian
mulai
Soket.SendText(MP_ACCEPT);
fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
akhir
lain Socket.SendText(MP_REFUSE+'mati');
akhir;
MP_FILEPROPERTY:mulai
//Untuk mengirim StrToInt(Copy(sTemp,2,Length(sTemp))) kali
//Tampilan kemajuan waktu. . .
Socket.SendText(MP_NEXTWILLBEDATA);
akhir;
MP_NEXTWILLBEDATA:mulai
Soket.SendText(MP_DATA);
bReadText:=salah;
akhir;
MP_END: mulai
fsRecv.Gratis
bBacaTeks:=benar;
akhir;
MP_ABORT: mulai
fsRecv.Gratis;
bBacaTeks:=benar;
akhir;
MP_CHAT: mulai
//Pesan Obrolan
akhir;
akhir;{kasus}
akhir
yang lain dimulai
mencoba
GetMem(bufRecv,2000);//2000 harus >iBYTESEND
Socket.ReceiveBuf(bufRecv^,iRecvLength);
fsRecv.WriteBuffer(bufRecv^,iRecvLength);
Akhirnya
FreeMem(bufRecv,2000);
akhir;{dari percobaan}
bBacaTeks:=benar;
Socket.SendText(MP_NEXTWILLBEDATA);
akhir;
akhir;
Program klien:
Tempatkan kontrol berikut: edtipAddress, OpenDialog1, btnConnect, btnSendFile,
cs.
btnConnect.OnClick(Pengirim:TObject);
mulai
cs.Alamat:=edtIPAddress.Teks;
cs.Pelabuhan:=2000;
cs.Hubungkan;
akhir;
btnSendFile.OnClick(Pengirim:TObject);
mulai
jika OpenDialog1.Jalankan lalu
Mulai
cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);//Ukuran File???