JavaRush /Blog Jawa /Random-JV /Kelas Socket lan ServerSocket, utawa "Halo, server? Apa s...
Sergey Simonov
tingkat
Санкт-Петербург

Kelas Socket lan ServerSocket, utawa "Halo, server? Apa sampeyan krungu aku?"

Diterbitake ing grup
Pambuka: “Meja ana komputer, ing mburine ana encoder...” Kelas Socket lan ServerSocket, utawa "Halo, server?  Apa sampeyan krungu aku?"  - 1 Biyen, salah sijine kanca sekelas masang asil pasinaon basa Jawa liyane, awujud screenshot program anyar. Program iki minangka obrolan multi pangguna. Ing wektu iku aku lagi miwiti lelampahan dhewe ing mastering program ing basa iki, nanging aku mesthi nyathet dhewe sing "Aku pengin!" Wektu liwati lan, sawise rampung nggarap proyek sabanjure minangka bagéan saka deepening kawruh program, Aku elinga kedadean sing lan mutusaké iku wektu. Piye wae aku wis miwiti kanggo dig menyang topik iki sejatine sifate saka penasaran, nanging ing buku teks Jawa utama (iku manual lengkap Schildt) mung 20 kaca kasedhiya kanggo paket java.net. Iki bisa dingerteni - bukune wis gedhe banget. Ana tabel metode lan konstruktor saka kelas utama, nanging kabeh iku. Langkah sabanjure, mesthi, Google moho kuwoso: myriad saka macem-macem artikel ngendi bab padha presented - loro utawa telung tembung bab sockets, lan conto siap-digawe. Pendekatan klasik (paling ora ing gaya sinau) yaiku ngerti dhisik apa sing dibutuhake saka alat kanggo kerja, apa iku, kenapa dibutuhake, lan mung banjur, yen solusi kanggo masalah kasebut ora jelas, pilih listings siap-digawe, unscrewing perkakas lan bolts. Nanging aku ngerti apa lan pungkasane nulis obrolan multi-user. Secara lahiriah, ternyata kaya mangkene: Kelas Socket lan ServerSocket, utawa "Halo, server?  Apa sampeyan krungu aku?"  - 2Ing kene aku bakal nyoba menehi pangerten babagan dhasar aplikasi klien-server adhedhasar soket Java nggunakake conto desain chatting. Ing kursus Javarash sampeyan bakal ngobrol. Bakal ana ing tingkat sing beda, ayu, gedhe, multifungsi. Nanging pisanan, sampeyan kudu nggawe dhasar, mula kita kudu ngerteni apa sing dadi dhasar bagean kasebut. (Yen sampeyan nemokake kekurangan utawa kesalahan, tulis ing PM utawa komentar ing artikel kasebut). Ayo diwiwiti. Kepala Siji: "Omah sing ..." Kanggo nerangake carane sambungan jaringan dumadi ing antarane server lan siji klien, ayo njupuk conto klasik saka bangunan apartemen. Contone, klien kudu nggawe sambungan karo server tartamtu. Apa sing kudu digoleki sing ditelusuri babagan obyek sing digoleki? Ya alamate. Server ora entitas gaib ing méga, lan mulane kudu dumunung ing mesin tartamtu. Kanthi analogi karo omah, ing ngendi rapat rong pihak sing disepakati kudu ditindakake. Lan supaya bisa nemokake saben liyane ing bangunan apartemen, siji alamat bangunan ora cukup, sampeyan kudu nunjukaké nomer apartemen kang rapat bakal njupuk Panggonan. Kajaba iku, ing siji komputer bisa uga sawetara server bebarengan, lan supaya klien bisa ngubungi siji tartamtu, uga kudu nemtokake nomer port liwat kang sambungan bakal kelakon. Dadi, alamat lan nomer port. Alamat tegese pengenal mesin ing ruang Internet. Bisa dadi jeneng domain, contone, "javarush.ru" , utawa IP biasa. Pelabuhan- nomer unik sing digandhengake karo soket tartamtu (istilah iki bakal dibahas mengko), kanthi tembung liyane, dikuwasani dening layanan tartamtu supaya bisa digunakake kanggo ngubungi. Dadi, supaya paling ora rong obyek bisa ketemu ing wilayah siji (server), pemilik wilayah (server) kudu manggoni apartemen tartamtu (pelabuhan) ing (mobil), lan sing kapindho kudu nemokake papan patemon sing ngerti. alamat omah (domain utawa ip ), lan nomer apartemen (port). Kepala Loro: Ketemu Soket Antarane konsep lan istilah sing ana gandhengane karo nggarap jaringan, siji sing penting banget yaiku Socket. Iku nuduhake titik liwat kang sambungan occurs. Cukup, soket nyambungake rong program ing jaringan. Kelas Socketngetrapake ide soket. Klien lan server bakal komunikasi liwat saluran input / output: Kelas Socket lan ServerSocket, utawa "Halo, server?  Apa sampeyan krungu aku?"  - 3 Kelas iki diumumake ing sisih klien, lan server nggawe maneh, nampa sinyal sambungan. Iki cara kerja komunikasi online. Kanggo miwiti, iki minangka konstruktor kelas sing bisa ditindakake Socket:
Socket(String Name_хоста, int порт) throws UnknownHostException, IOException
Socket(InetAddress IP-address, int порт) throws UnknownHostException
"host_name" - nuduhake simpul jaringan tartamtu, alamat IP. Yen kelas soket ora bisa diowahi dadi alamat nyata sing wis ana, mula pangecualian bakal dibuwang UnknownHostException. Pelabuhan minangka pelabuhan. Yen 0 ditemtokake minangka nomer port, sistem kasebut dhewe bakal menehi port gratis. Pangecualian uga bisa kedadeyan yen sambungan kasebut ilang IOException. Perlu dicathet yen jinis alamat ing konstruktor kapindho yaiku InetAddress. Nerangake kanggo ngluwari, contone, nalika sampeyan kudu nemtokake jeneng domain minangka alamat. Uga, nalika domain tegese sawetara alamat IP, InetAddresssampeyan bisa nggunakake kanggo njaluk larik mau. Nanging, uga bisa digunakake karo IP. Sampeyan uga bisa njaluk jeneng host, array byte sing nggawe alamat IP, lsp. Kita bakal ndemek luwih dhisik, nanging sampeyan kudu pindhah menyang dokumentasi resmi kanggo rincian lengkap. Nalika obyek saka jinis wis initialized Socket, klien kang belongs mbewarakke ing jaringan sing pengin nyambung menyang server ing alamat tartamtu lan nomer port. Ing ngisor iki cara sing paling kerep digunakake ing kelas Socket: InetAddress getInetAddress()- ngasilake obyek sing ngemot data babagan soket. Yen soket ora disambungake - null int getPort()- ngasilake port sing ana sambungan menyang server int getLocalPort()- ngasilake port sing disambungake menyang soket. Kasunyatane yaiku klien lan server bisa "komunikasi" ing siji port, nanging port sing disambungake bisa beda-beda boolean isConnected()- bali bener yen sambungan digawe void connect(SocketAddress address)- nuduhake sambungan anyar boolean isClosed()- bali bener, yen soket ditutup. boolean isBound()- ngasilake bener, yen soket bener kaiket alamat, kelas Socketngleksanakake antarmuka AutoCloseable, supaya bisa digunakake ing try-with-resources. Nanging, sampeyan uga bisa nutup soket ing cara klasik, nggunakake cedhak (). Kepala Tiga: lan iki ServerSocket Ayo kita nyatakake, ing wangun kelas Socket, panjalukan sambungan ing sisih klien. Kepiye server bakal ngira kepinginan kita? Kanggo iki, server duwe kelas kaya ServerSocket, lan cara nampa () ing. Konstruktor kasebut ditampilake ing ngisor iki:
ServerSocket() throws IOException
ServerSocket(int порт) throws IOException
ServerSocket(int порт, int максимум_подключений) throws IOException
ServerSocket(int порт, int максимум_подключений, InetAddress локальный_address) throws IOException
Nalika wara-wara, ServerSocket sampeyan ora perlu kanggo nemtokake alamat sambungan, amarga komunikasi njupuk Panggonan ing mesin server. Mung karo host multi-saluran sampeyan kudu nemtokake IP kang soket server bound kanggo. Kepala Three.One: Server Sing Ngomong Ora Wiwit nyedhiyakake program kanthi sumber daya luwih akeh tinimbang sing dibutuhake, larang lan ora wajar, mula ing konstruktor ServerSocketsampeyan dijaluk ngumumake sambungan maksimal sing ditampa dening server sajrone operasi. Yen ora ditemtokake, banjur kanthi standar nomer iki bakal dianggep padha karo 50. Ya, ing teori kita bisa nganggep yen ServerSocketiki minangka soket sing padha, mung kanggo server. Nanging peran kasebut beda banget karo kelas Socket. Iku mung perlu ing tataran nggawe sambungan. Sawise nggawe obyek jinis, ServerSocketsampeyan kudu ngerteni manawa ana wong sing pengin nyambung menyang server. Cara nampa () disambungake ing kene. Sasaran ngenteni nganti ana wong sing pengin nyambungake, lan nalika kedadeyan kasebut ngasilake obyek saka jinis Socket, yaiku, soket klien sing digawe maneh. Lan saiki soket klien wis digawe ing sisih server, komunikasi rong arah bisa diwiwiti. Nggawe obyek jinis Socketing sisih klien lan nggawe maneh nggunakake ServerSocketsisih server minangka minimal sing dibutuhake kanggo sambungan kasebut. Kepala Papat: Surat kanggo Santa Claus Вопрос: Kepiye carane klien lan server komunikasi? Ответ:Liwat I / O stream. Apa kita wis duwe? A soket karo alamat server lan nomer port klien, lan bab sing padha, thanks kanggo nampa (), ing sisih server. Dadi cukup kanggo nganggep yen dheweke bakal komunikasi liwat soket. Kanggo nindakake iki, ana rong cara sing menehi akses menyang stream InputStreamlan OutputStreamobyek saka jinis Socket. Punika:
InputStream getInputStream()
OutputStream getOutputStream()
Wiwit maca lan nulis bait gundhul ora efisien, stream bisa kebungkus ing kelas adaptor, buffered utawa ora. Tuladhane:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Supaya komunikasi dadi loro arah, operasi kasebut kudu ditindakake ing loro-lorone. Saiki sampeyan bisa ngirim soko nggunakake ing, lan nampa soko nggunakake metu, lan kosok balene. Bener, iki mung siji-sijine fungsi kelas Socket. Lan ya, aja lali babagan cara siram () BufferedWriter- siram isi buffer. Yen iki ora rampung, informasi ora bakal dikirim lan, mulane, ora bakal ditampa. Utas panampa uga ngenteni indikator end-of-line - "\n", yen ora, pesen kasebut ora bakal ditampa, amarga nyatane pesen kasebut durung rampung lan durung rampung. Yen iki misale jek ora trep kanggo sampeyan, aja padha sumelang, sampeyan bisa tansah nggunakake kelas PrintWriter, kang kudu mbungkus metu, nemtokake bener minangka argumen kapindho, lan banjur popping saka buffer bakal kelakon kanthi otomatis:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
Uga, ora perlu kanggo nuduhake mburi baris; kelas iki nindakake kanggo sampeyan. Nanging string I / O watesan apa sing bisa ditindakake soket? Ora, sampeyan pengin ngirim obyek liwat soket streams? Demi Allah. Serialize lan sampeyan bisa pindhah:
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Kepala Lima: Komunikasi nyata liwat Internet Wiwit kanggo nyambung liwat jaringan nyata karo alamat IP nyata sampeyan kudu duwe server lengkap, lan wiwit:
  1. Obrolan mangsa ngarep kita, minangka sarana, ora duwe kabisan kaya ngono. Iku mung bisa nggawe sambungan lan nampa / ngirim pesen. Yaiku, ora duwe kemampuan server nyata.
  2. Server kita, mung ngemot data soket lan aliran I / O, ora bisa digunakake minangka server WEB utawa FTP nyata, mula mung iki kita ora bakal bisa nyambung liwat Internet.
Kajaba iku, kita mung miwiti ngembangake program kasebut, sing tegese ora cukup stabil kanggo langsung nggarap jaringan nyata, mula kita bakal nggunakake host lokal minangka alamat sambungan. Tegese, ing teori, klien lan server isih ora bisa disambungake kanthi cara apa wae kajaba liwat soket, nanging kanggo debugging program kasebut bakal ana ing mesin sing padha, tanpa kontak nyata liwat jaringan. Kanggo nunjukake ing konstruktor Socketyen alamat kasebut lokal, ana rong cara:
  1. Tulis "localhost" minangka argumen alamat, tegese rintisan lokal. "127.0.0.1" uga cocok kanggo iki - iki mung wangun digital rintisan.
  2. Nggunakake InetAddress:
    1. InetAddress.getByName(null)- null TCTerms kanggo localhost
    2. InetAddress.getByName("localhost")
    3. InetAddress.getByName("127.0.0.1")
Kanggo kesederhanaan, kita bakal nggunakake "localhost" saka jinis String. Nanging kabeh opsi liyane uga bisa digunakake. Kepala Enem: Iku wektu kanggo obrolan Dadi, kita wis duwe kabeh sing perlu kanggo ngleksanakake sesi obrolan karo server. Kabeh sing isih ana yaiku kanggo nggabungake: Listing ing ngisor iki nuduhake carane klien nyambung menyang server, ngirim pesen siji, lan server, ing siji, nandheske sing nampa pesen nggunakake minangka argumen ing sawijining: "Server. jawa"
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    private static Socket clientSocket; // socket for communication
    private static ServerSocket server; // server socket
    private static BufferedReader in; // socket read stream
    private static BufferedWriter out; // socket write stream

    public static void main(String[] args) {
        try {
            try  {
                server = new ServerSocket(4004); // server socket listening on port 4004
                System.out.println("Server is running!"); // server would be nice
                // announce your launch
                clientSocket = server.accept(); // accept() will wait until
                //someone won't want to connect
                try { // after establishing a connection and recreating the socket for communication with the client, you can go
                    // to create I/O streams.
                    // now we can receive messages
                    in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                    // and send
                    out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

                    String word = in.readLine(); // wait for the client to write something to us
                    System.out.println(word);
                    // without hesitation responds to the client
                    out.write("Hi, this is the Server! I confirm you wrote: " + word + "\n");
                    out.flush(); // push everything out of the buffer

                } finally { // in any case, the socket will be closed
                    clientSocket.close();
                    // streams would also be nice to close
                    in.close();
                    out.close();
                }
            } finally {
                System.out.println("Server closed!");
                    server.close();
            }
        } catch (IOException e) {
            System.err.println(e);
        }
    }
"Client.java"
import java.io.*;
import java.net.Socket;

public class Client {

    private static Socket clientSocket; // socket for communication
    private static BufferedReader reader; // we need a reader that reads from the console, otherwise
    // do we know what the client wants to say?
    private static BufferedReader in; // socket read stream
    private static BufferedWriter out; // socket write stream

    public static void main(String[] args) {
        try {
            try {
                // address - local host, port - 4004, same as the server
                clientSocket = new Socket("localhost", 4004); // with this line we request
                // the server has access to the connection
                reader = new BufferedReader(new InputStreamReader(System.in));
                // read messages from the server
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                // write there
                out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

                System.out.println("Did you have something to say? Enter it here:");
                // if the connection happened and the threads were successfully created - we can
                // work further and offer the client something to enter
                // if not, an exception will be thrown
                String word = reader.readLine(); // wait for the client to do something
                // will not write to the console
                out.write(word + "\n"); // send a message to the server
                out.flush();
                String serverWord = in.readLine(); // wait for the server to say
                System.out.println(serverWord); // received - display
            } finally { // in any case, you need to close the socket and streams
                System.out.println("The client has been closed...");
                clientSocket.close();
                in.close();
                out.close();
            }
        } catch (IOException e) {
            System.err.println(e);
        }

    }
}
Mesthi wae, sampeyan kudu miwiti server dhisik, amarga apa sing bakal disambungake klien nalika wiwitan yen ora ana sing bakal nyambungake? :) Output bakal kaya iki: /* Apa sampeyan pengin ngomong apa? Ketik kene: Halo, server? Apa sampeyan krungu aku? Halo, iki Server! Aku konfirmasi, sampeyan wrote: Hello, server? Apa sampeyan krungu aku? Klien ditutup... */ Hore! We mulang server kanggo komunikasi karo klien! Supaya komunikasi ora dumadi ing rong réplika, nanging kaya sing dikarepake, mung mbungkus maca lan nulis benang ing sawetara wektu (bener) lan nuduhake metu sing, miturut pesen tartamtu, contone, "metu". , siklus iki diselani, lan program bakal mungkasi. Kepala Seven: Multi-user luwih apik. Kasunyatan bilih server bisa krungu kita apik, nanging bakal luwih apik yen kita bisa komunikasi karo wong saka jenis kita dhewe. Aku bakal masang kabeh sumber ing mburi artikel, supaya kene aku bakal nuduhake ora tansah gedhe, nanging bagéyan penting kode sing bakal nggawe iku bisa, yen digunakake kanthi bener, kanggo concoct chatting multi-panganggo. Dadi, kita pengin bisa komunikasi karo sawetara klien liyane liwat server. Carane nindakake? Temenan, amarga program klien duwe metode dhewe main, tegese bisa diluncurake kanthi kapisah saka server lan sejajar karo klien liyane. Apa iki menehi kita? Piye wae, perlu yen saben sambungan anyar server ora langsung menyang komunikasi, nanging nulis sambungan iki menyang sawetara jinis dhaptar lan terus ngenteni sambungan anyar, lan sawetara jinis layanan tambahan melu komunikasi karo tartamtu. klien. Lan klien kudu nulis menyang server lan ngenteni respon independen saka saben liyane. Utas teka kanggo ngluwari. Ayo kita duwe kelas sing tanggung jawab kanggo ngelingi sambungan anyar: Sampeyan kudu kasebut ing ngisor iki:
  1. Nomer port.
  2. Dhaptar sing nulis sambungan anyar.
  3. Lan ServerSocket, ing salinan siji (!).
public class Server {

    public static final int PORT = 8080;
    public static LinkedList<ServerSomthing> serverList = new LinkedList<>(); // list of all threads

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(PORT);
            try {
            while (true) {
                // Blocks until a new connection is made:
                Socket socket = server.accept();
                try {
                    serverList.add(new ServerSomthing(socket)); // add a new connection to the list
                } catch (IOException e) {
                    // If it fails, the socket is closed,
                    // otherwise, the thread will close it when it exits:
                    socket.close();
                }
            }
        } finally {
            server.close();
        }
    }
}
Oke, saiki saben soket sing digawe maneh ora bakal ilang, nanging bakal disimpen ing server. Salajengipun. Saben pelanggan butuh wong sing ngrungokake. Ayo nggawe thread karo fungsi server saka bab pungkasan.
class ServerSomthing extends Thread {

    private Socket socket; // socket through which the server communicates with the client,
    // except for it - the client and server are not connected in any way
    private BufferedReader in; // socket read stream
    private BufferedWriter out; // socket write stream

    public ServerSomthing(Socket socket) throws IOException {
        this.socket = socket;
        // если потоку ввода/вывода приведут к генерированию исключения, оно пробросится дальше
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        start(); // call run()
    }
    @Override
    public void run() {
        String word;
        try {

            while (true) {
                word = in.readLine();
                if(word.equals("stop")) {
                    break;                }
                for (ServerSomthing vr : Server.serverList) {
                    vr.send(word); // send the received message with
                   // bound client to everyone else including him
                }
            }

        } catch (IOException e) {
        }
    }

    private void send(String msg) {
        try {
            out.write(msg + "\n");
            out.flush();
        } catch (IOException ignored) {}
    }
}
Dadi, ing konstruktor thread server, soket kudu diinisialisasi liwat thread kasebut bakal komunikasi karo klien tartamtu. Uga I / O Utas, lan kabeh liya sing perlu kanggo miwiti Utas langsung saka konstruktor. Oke, nanging apa sing kedadeyan nalika thread server maca pesen saka klien? Kirim bali mung menyang klien sampeyan? Ora efektif banget. Kita nggawe chatting multi pangguna, mula kita butuh saben klien sing disambungake kanggo nampa apa sing ditulis wong siji. Sampeyan kudu nggunakake dhaptar kabeh utas server sing digandhengake karo klien lan ngirim saben pesen sing dikirim menyang thread tartamtu supaya dikirim menyang klien:
for (ServerSomthing vr : Server.serverList) {
    vr.send(word); // send the received message
    // from the linked client to everyone else, including him
}
private void send(String msg) {
    try {
        out.write(msg + "\n");
        out.flush();
    } catch (IOException ignored) {}
}
Saiki kabeh klien bakal ngerti apa sing diomongake! Yen sampeyan ora pengin pesen kasebut dikirim menyang wong sing ngirim (dheweke wis ngerti apa sing ditulis!), Cukup nalika ngubengi benang, nemtokake manawa nalika ngolah obyek, daur ulang thisbakal pindhah menyang unsur sabanjure tanpa nindakake. tumindak apa wae. Utawa, yen sampeyan seneng, kirim pesen menyang klien sing nyatakake yen pesen kasebut kasil ditampa lan dikirim. Kabeh wis jelas karo server saiki. Ayo pindhah menyang klien, utawa luwih menyang klien! Kabeh padha ana, dening analogi karo klien saka bab pungkasan, mung nalika nggawe Kayata sampeyan perlu, minangka ditampilake ing bab iki karo server, kanggo nggawe kabeh perlu ing konstruktor. Nanging kepiye yen, nalika nggawe klien, dheweke durung duwe wektu kanggo ngetik apa wae, nanging ana sing wis dikirim menyang dheweke? (Contone, sejarah korespondensi wong-wong sing wis nyambung menyang obrolan sadurunge). Dadi siklus ing ngendi pesen sing dikirim bakal diproses kudu dipisahake saka pesen sing diwaca saka konsol lan dikirim menyang server kanggo diterusake menyang wong liya. Utas teka kanggo ngluwari maneh. Ora ana gunane nggawe klien minangka benang. Iku luwih trep kanggo nggawe thread karo daur ulang ing cara mbukak sing maca pesen, lan uga, dening analogi, nyerat:
// thread reading messages from the server
private class ReadMsg extends Thread {
    @Override
    public void run() {

        String str;
        try {
            while (true) {
                str = in.readLine(); // waiting for a message from the server
                if (str.equals("stop")) {

                    break; // exit the loop if it's "stop"
                }
                            }
        } catch (IOException e) {

        }
    }
}
// thread sending messages coming from the console to the server
public class WriteMsg extends Thread {

    @Override
    public void run() {
        while (true) {
            String userWord;
            try {
               userWord = inputUser.readLine(); // messages from the console
                if (userWord.equals("stop")) {
                    out.write("stop" + "\n");
                    break; // exit the loop if it's "stop"
                } else {
                    out.write(userWord + "\n"); // send to the server
                }
                out.flush(); // clean up
            } catch (IOException e) {

            }

        }
    }
}
Ing konstruktor klien sampeyan mung kudu miwiti utas kasebut. Kepiye cara nutup sumber daya klien kanthi bener yen dheweke pengin ninggalake? Apa aku kudu nutup sumber thread server? Kanggo nindakake iki, sampeyan kudu nggawe cara kapisah sing diarani nalika metu saka daur ulang pesen. Ing kana sampeyan kudu nutup soket lan stream I/O. Sinyal pungkasan sesi sing padha kanggo klien tartamtu kudu dikirim menyang utas server, sing kudu nindakake perkara sing padha karo soket lan mbusak dhewe saka dhaptar benang ing kelas server utama. Kepala Wolung: Ora ana watesan kanggo kesempurnaan Sampeyan bisa nggawe fitur anyar tanpa wates kanggo nambah proyek sampeyan. Nanging apa sing kudu ditransfer menyang klien sing mentas disambungake? Aku kira sepuluh acara pungkasan kedadeyan sadurunge dheweke teka. Kanggo nindakake iki, sampeyan kudu nggawe kelas ing ngendi tumindak pungkasan karo thread server apa wae bakal dilebokake ing dhaptar sing diumumake, lan yen dhaptar wis kebak (yaiku, wis ana 10), mbusak sing pisanan lan nambah. sing pungkasan teka. Supaya isi dhaptar iki bisa ditampa dening sambungan anyar, nalika nggawe thread server, ing stream output, sampeyan kudu ngirim menyang klien. Carane nindakake? Contone, kaya iki:
public void printStory(BufferedWriter writer) {
// ...
}
Utas server wis nggawe stream lan bisa ngliwati stream output minangka argumen. Sabanjure, sampeyan mung kudu ngliwati kabeh sing kudu ditransfer menyang klien anyar ing siklus panelusuran. Kesimpulan: Iki mung dhasar, lan kemungkinan arsitektur chatting iki ora bisa digunakake nalika nggawe aplikasi nyata. Program iki digawe kanggo tujuan pendidikan lan ing basis aku nuduhake carane sampeyan bisa nggawe klien komunikasi karo server (lan kosok balene), carane nindakake iki kanggo sawetara sambungan, lan, mesthi, carane iki diatur ing sockets. Sumber kasebut disusun maneh ing ngisor iki, lan kode sumber program sing dianalisis uga dilampirake. Iki minangka pengalaman pertama saya nulis artikel) Matur nuwun kanggo perhatian sampeyan :)
  1. Thinking in Java Enterprise, dening Bruce Eckel et. Al. 2003
  2. Java 8, The Complete Guide, Herbert Schildt, 9th edition, 2017 (Bab 22)
  3. Pemrograman soket ing artikel Jawa babagan soket
  4. Socket ing dokumentasi resmi
  5. ServerSocket ing dokumentasi resmi
  6. sumber ing GitHub
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION