[Abstrak] Pemrogram yang telah menulis aplikasi Winsock tahu bahwa menulis aplikasi Winsock bukanlah tugas yang mudah. Anda tidak boleh langsung menangani API kompleks di Winsock. Untungnya, Tclientsocket dan Tserversocket di Delphi4 merangkum API yang relevan di Windows sangat menyederhanakan akses. ke Winsock, memungkinkan kita menulis aplikasi Winsock dengan sangat mudah. Artikel ini memperkenalkan cara menulis aplikasi Winsock menggunakan Delphi melalui contoh membaca layar komputer lain di LAN.
Siapa pun yang pernah bekerja sebagai administrator jaringan di tempat kerja mungkin pernah mengalami pengalaman ini. Betapa menjengkelkannya menginstruksikan orang lain untuk mengoperasikannya dengan "remote control" melalui telepon dari atas gedung ke bawah untuk urusan sepele setiap hari, apa yang harus dilakukan? Bagaimana kalau menulis program yang membaca layar komputer lain? Ini jauh lebih intuitif. Untuk berkomunikasi dalam LAN, pilihan terbaik tentu saja menggunakan Winsock. Pemrogram yang telah menulis aplikasi Winsock tahu bahwa menulis aplikasi Winsock bukanlah tugas yang mudah. Untungnya, Anda tidak harus berurusan langsung dengan API yang kompleks di Winsock dan Tserversocket di Delphi4 merangkum API yang relevan di Windows, yang sangat menyederhanakan akses ke Winsock dan memungkinkan kita menulis aplikasi Winsock dengan sangat mudah. Namun demikian, yang terbaik adalah memiliki pemahaman tentang Winsock. Saya tidak akan menjelaskan secara rinci di sini.
Untuk mengirimkan data melalui jaringan, Anda memerlukan setidaknya sepasang Socket, satu di klien dan yang lainnya di server. Setelah soket klien dan server membuat sambungan, mereka dapat berkomunikasi satu sama lain dibuat di Tcp/ Berdasarkan ip, ini juga mendukung ipx/spx dan protokol terkait lainnya. Di Delphi, Tclientsocket dan Tserversocket digunakan untuk mengontrol koneksi dan komunikasi antara klien dan Socket server. Perlu dicatat bahwa kedua komponen ini digunakan untuk mengelola koneksi antara server dan klien. Keduanya bukan objek Socket. Objek Socket dimanipulasi oleh TcustomwinSocket, seperti Tclientwinsocket, Tserverclientwinsocket, dan Tserverwinsocket.
1. Komponen Tclientsocket:
Dengan menambahkan Tclientsocket ke Formulir, aplikasi menjadi klien Tcp/ip, dan Tclientsocket dapat digunakan untuk memanipulasi objek Socket klien.
Untuk membuat koneksi ke server, Anda terlebih dahulu menentukan server yang ingin Anda sambungkan. Ada dua cara untuk menentukan server. Salah satunya adalah dengan mengatur atribut Host untuk menentukan nama host server, seperti http://www.inPRise.com atau nama mesin di LAN memerlukan resolusi nama domain, yang akan sedikit lebih cepat. Metode lainnya adalah dengan menyetel atribut Alamat untuk menentukan alamat IP host, seperti 130.0.1.1. Kedua metode ini setara, tetapi jika Host dan Alamat disetel, Delphi hanya akan menggunakan properti Host.
Maka Anda perlu menentukan nomor port untuk terhubung ke server. Ada dua cara di sini. Pertama adalah mengatur Layanan untuk menggunakan nomor port default. Yang lainnya adalah dengan langsung mengatur nomor port Port di bawah 1024 , banyak yang telah dialokasikan, seperti FTP. Portnya 20 dan 21, port SMTP 25, port server WEB 80, dll. Untuk mencegah konflik yang tidak disengaja, disarankan saat memprogram aplikasi Anda sendiri. yang terbaik adalah mengatur Port ke 1024 atau lebih tinggi. Jika Layanan dan port diatur secara bersamaan, Delphi akan menggunakan port default Layanan.
Setelah menentukan nomor server dan port, panggil metode terbuka atau atur atribut Aktif ke True. Socket klien akan membuat permintaan koneksi ke Socket server. Jika server dalam keadaan mendengarkan saat ini, maka secara otomatis akan menerima permintaan untuk membuat koneksi. Saat terhubung, acara Onconnetnya dipicu. Saat Anda perlu memutuskan sambungan, Anda hanya perlu memanggil metode tutup atau menyetel atribut Aktif ke False. Saat ini, peristiwa ondisconnet akan dipicu.
2. Komponen Tserversocket:
Seperti Tclientsocket, untuk membangun server, Anda hanya perlu menempatkan komponen Tserversock di Form.
Objek soket sisi server lebih rumit untuk dikelola. Ketika server dalam keadaan mendengarkan, objek soket server dimanipulasi oleh Tserversocket; ketika klien membuat permintaan, server merespons permintaan tersebut dan membuat koneksi. Pada saat ini, Tserverclientwinsocket digunakan untuk memanipulasi koneksi antar server Socket dan Socket klien.
Untuk menempatkan server dalam keadaan mendengarkan, Anda harus terlebih dahulu menentukan nomor port, tentu saja harus sama dengan nomor port klien. Kemudian panggil metode terbuka atau atur properti Aktif ke True.
3. Komunikasi:
Setelah koneksi antara klien dan server terjalin, komunikasi satu sama lain dapat dimulai. Delphi menyediakan beberapa metode komunikasi untuk Tserversocket dan Tclientsocket. Sendtext digunakan untuk mengirim informasi teks, sendstream digunakan untuk mengirim stream, dan SendBuf digunakan untuk mengirim data dengan panjang tertentu.
Perlu dicatat bahwa karena ukuran buffer default Windows adalah 4K, saat mengirim informasi lebih panjang dari 4K, misalnya aliran biner yang dikirim dari server ke klien, Anda hanya perlu menggunakan Socket.SendStream() di server. , tetapi berbeda pada klien. Ini akan memicu peristiwa onread beberapa kali, dan Delphi tidak mendefinisikan peristiwa seperti "onreadend". Oleh karena itu, pemrogram harus mengumpulkan datanya sendiri saat menerima. Metode yang digunakan dalam artikel ini adalah pertama-tama mengirimkan panjang aliran ke klien, lalu mengirim aliran tersebut. Klien menulis data yang diterima ke dalam aliran. Ketika panjang aliran sama dengan panjang yang dikirim kembali oleh server, hal ini menunjukkan bahwa klien telah selesai menerimanya. Untuk server, aliran yang digunakan sebagai parameter sendstream akan "dimiliki" oleh Socket. Ketika objek Socket berakhir, itu juga akan berakhir.
Begitu pula ketika teks yang dikirim kurang dari 4K, misalnya saat melakukan panggilan berikut di program klien
clientocket1.Socket.SendText('mendapat');
clientocket1.Socket.SendText('mendapat');
clientocket1.Socket.SendText('mendapat');
Ketika server menerima, akan muncul fenomena seperti getgets. Hal ini mungkin terjadi karena ketika data di buffer belum terkirim, teks baru dimasukkan ke dalam buffer, dan komputer memperlakukannya sebagai kumpulan data yang sama untuk diproses. . Untuk menghindari terjadinya fenomena ini, Anda dapat menggunakan metode "melempar bola" bolak-balik dalam program:
server klien
clientocket1.Socket.SendText('data1') soket.ReceiveText;
soket.sendtext('ok');
soket.receivetext;
clientocket1.Socket.SendText('data2')
soket.ReceiveText;
soket.sendtext('akhir');
soket.receivetext;
Setelah menjalankan program server di komputer lain, masukkan nama komputer di kotak teks program klien Anda, klik "Hubungkan", dan klik "Dapatkan Gambar". Anda akan melihat dengan jelas layar komputer pihak lain. Berikut ini adalah keseluruhan kode sumber program. Program ini dapat berjalan di NT4.0, Win95, Win98, dan LAN. Tentu saja, Windows harus menginstal protokol TCP/IP, dan harus memiliki IP yang ditetapkan atau ditetapkan secara dinamis alamat.
Jika Anda merasa kesulitan untuk "memerintahkan" saat menonton, Anda juga dapat menganalisis kejadian keyboard dan mouse pada image1, lalu mengirimkannya ke server Setelah server menerimanya, server akan melakukan operasi yang sama lagi, sehingga Anda tidak perlu melakukan hal yang sama tidak perlu khawatir. Dengan menggunakan Tclientsocket dan Tserversocket Delphi, Anda juga dapat menyelesaikan pengembangan aplikasi seperti penyalinan file, obrolan online, ICQ, dll. Implementasinya sangat sederhana.
Program klien:
satuan cm utama;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog,
ScktComp, StdCtrls, ExtCtrls, jpeg;
jenis
TForm1 = kelas(TForm)
Panel1: TPanel;
ScrollBox1: TScrollBox;
Gambar1: Gambar;
Tombol1: Tombol T;
Sunting1: TEdit;
Tombol2: Tombol T;
ClientSocket1: TClientSocket;
Label1: Label;
prosedur Button1Click(Pengirim: TObject);
prosedur Button2Click(Pengirim: TObject);
prosedur ClientSocket1Connect(Pengirim: TObject;
Soket: TCustomWinSocket);
prosedur ClientSocket1Error(Pengirim: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var Kode Kesalahan: Integer);
prosedur ClientSocket1Read(Pengirim: TObject; Socket: TCustomWinSocket);
prosedur FormCreate(Pengirim: TObject);
procedure FormClose(Pengirim: TObject; var Action: TCloseAction);
pribadi
{Deklarasi pribadi}
publik
{Pernyataan publik}
akhir;
var
Formulir1: TForm1;
c:lama;
m: aliran memori;
pelaksanaan
{$R *.DFM}
prosedur TForm1.Button1Click(Pengirim: TObject);
mulai
mencoba
soket klien1.Tutup;
clientocket1.Host:=edit1.teks;
clientocket1.Buka; //Hubungkan ke server
kecuali
showmessage(edit1.text+#13#10+'Komputer tidak dihidupkan atau program layanan tidak diinstal');
akhir;
akhir;
procedure TForm1.Button2Click(Pengirim: TObject);
mulai
clientocket1.Socket.SendText('gets'); //Kirim permintaan untuk memberi tahu server bahwa gambar layar diperlukan
akhir;
prosedur TForm1.ClientSocket1Connect(Pengirim: TObject;
Soket: TCustomWinSocket);
mulai
keterangan:='Hubungkan ke'+edit1.teks;
akhir;
prosedur TForm1.ClientSocket1Error(Pengirim: TObject;
Soket: TCustomWinSocket; ErrorEvent: TErrorEvent;
varErrorCode: Bilangan Bulat);
mulai
keterangan:='Koneksi'+edit1.text+'Gagal';
showmessage(edit1.text+#13#10+'Komputer tidak dihidupkan atau program layanan tidak diinstal');
kode kesalahan:=0;
akhir;
procedure TForm1.ClientSocket1Read(Pengirim: TObject;
Soket: TCustomWinSocket);
var
buffer:array [0..10000] byte; //Setel buffer penerimaan
len: bilangan bulat;
aku akan: tali;
b: peta bit;
j:tjpegimage;
mulai
jika c=0 maka //C adalah jumlah byte yang dikirim oleh server. Jika 0 berarti penerimaan gambar belum dimulai.
mulai
ll:=socket.ReceiveText;
c:=strtoint(ll); //Menetapkan jumlah byte yang akan diterima
clientocket1.Socket.SendText('okok'); //Beri tahu server untuk mulai mengirim gambar
akhiri yang lain
mulai //Berikut ini adalah bagian penerima data gambar
len:=socket.ReceiveLength; //Baca panjang paket
socket.ReceiveBuf(buffer,len); //Menerima paket data dan membacanya ke dalam buffer
m.Write(buffer,len); //Tambahkan ke streaming M
jika m.Ukuran>=c maka //Jika panjang aliran lebih besar dari jumlah byte yang akan diterima, penerimaan selesai
mulai
m.Posisi:=0;
b:=tbitmap.Buat;
j:=tjpegimage.Buat;
mencoba
j.LoadFromStream(m); //Membaca data di aliran M ke dalam objek gambar JPG J
b.Tugas(j); //Konversi JPG ke BMP
Image1.Picture.Bitmap.Assign(b); //Tetapkan ke komponen image1
akhirnya //Berikut ini adalah pekerjaan pembersihan
b.gratis;
j.gratis;
clientocket1.Aktif:=salah;
clientocket1.Aktif:=benar;
m.Bersih;
c:=0;
akhir;
akhir;
akhir;
akhir;
prosedur TForm1.FormCreate(Pengirim: TObject);
mulai
m:=tmemorystream.Buat;
akhir;
procedure TForm1.FormClose(Pengirim: TObject; var Action: TCloseAction);
mulai
m.gratis;
ClientSocket1.Tutup;
akhir;
akhir.
Program pelayan:
satuan utama;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog,
ScktComp, jpeg;
jenis
TForm1 = kelas(TForm)
ServerSocket1: TServerSocket;
prosedur ServerSocket1ClientRead(Pengirim: TObject;
Soket: TCustomWinSocket);
prosedur FormCreate(Pengirim: TObject);
pribadi
{Deklarasi pribadi}
publik
{Pernyataan publik}
akhir;
var
Formulir1: TForm1;
m1: aliran memori;
pelaksanaan
{$R *.DFM}
prosedur TForm1.ServerSocket1ClientRead(Pengirim: TObject;
Soket: TCustomWinSocket);
var
s,s1:tali;
meja:kanvas;
bitmap:tbitmap;
jpg:tjpegimage;
mulai
s:=socket.ReceiveText;
if s='gets'then //Klien mengeluarkan permintaan
mulai
bitmap:=tbitmap.Buat;
jpg:=tjpegimage.Buat;
desk:=tcanvas.Create; //Kode berikut ini untuk mendapatkan gambar layar saat ini
meja.Pegangan:=getdc(hwnd_desktop);
m1:=tmemorystream.Create; //Inisialisasi aliran m1, setelah mengirim aliran dengan sendstream(m1),
//Itu akan tetap ada sampai percakapan soket berakhir,
//Tidak dapat dibebaskan secara manual, jika tidak, pengecualian akan dipicu
dengan bitmap lakukan
mulai
lebar:=layar.Lebar;
tinggi:=layar.Tinggi;
kanvas.CopyRect(kanvas.cliprect,desk,desk.cliprect);
akhir;
jpg.Assign(bitmap); //Konversi gambar ke format JPG
jpg.SaveToStream(m1); //Tulis gambar JPG ke dalam aliran
jpg.gratis;
m1.Posisi:=0;
s1:=inttostr(m1.ukuran);
Socket.sendtext(s1); //Kirim ukuran gambar
akhir;
if s='okok' maka //Klien siap menerima gambar
mulai
m1.Posisi:=0;
Socket.SendStream(m1); //Kirim gambar JPG
akhir;
akhir;
prosedur TForm1.FormCreate(Pengirim: TObject);
mulai
ServerSocket1.buka;
akhir;
akhir.