JavaRush /Java Blog /Random-TK /Socket we ServerSocket sapaklary ýa-da “Salam, serwer? Eş...
Sergey Simonov
Dereje
Санкт-Петербург

Socket we ServerSocket sapaklary ýa-da “Salam, serwer? Eşidip bilersiňizmi? "

Toparda çap edildi
Giriş: “Stolda kompýuter bardy, aňyrsynda kodlaýjy bardy ...” Socket we ServerSocket sapaklary ýa-da “Salam, serwer?  Eşidip bilersiňizmi? "  - 1 Bir wagtlar, klasdaşlarymyň biri Java programmasyny öwrenmegiň başga bir netijesini täze programmanyň skrinshot görnüşinde ýerleşdirdi. Bu programma köp ulanyjy söhbeti boldy. Şol wagt men bu dilde programmirlemegi özleşdirmek üçin öz syýahatymy başladym, ýöne hökman "muny isleýärin!" Wagt geçdi we programmirleme bilimimi çuňlaşdyrmagyň bir bölegi hökmünde indiki taslama üstünde işlänimden soň, bu wakany ýada saldym we wagtyň gelendigini kesgitledim. Nädip-de bolsa bilesigelijilik sebäpli bu mowzugy öwrenip başladym, ýöne esasy Java okuw kitabymda (bu Şildtiň doly gollanmasydy) java.net bukjasy üçin bary-ýogy 20 sahypa berildi. Bu düşnükli - kitap eýýäm gaty uly. Esasy synplaryň usullary we konstruktorlary bar, ýöne bularyň hemmesi. Indiki ädim, elbetde, gudratygüýçli Google: şol bir zadyň hödürlenýän dürli makalalary - rozetkalar hakda iki ýa-da üç söz we taýýar mysal. Nusgawy çemeleşme (iň bolmanda okuw stilimde) ilki bilen iş üçin haýsy gurallaryň gerekdigini, olaryň nämedigini, näme üçin zerurdygyny düşünmekdir we diňe şondan soň meseläniň çözgüdi aýdyň bolmasa, taýyn boluň. - ýasalan sanawlar, hozlary we boltlary açyň. Whatöne nämäniň nämedigine düşündim we ahyrynda köp ulanyjy söhbetini ýazdym. Daşardan şeýle bir zat çykdy: Socket we ServerSocket sapaklary ýa-da “Salam, serwer?  Eşidip bilersiňizmi? "  - 2Ine, men size söhbet dizaýnynyň mysalyny ulanyp, Java rozetkalaryna esaslanýan müşderi-serwer programmalarynyň esaslaryna düşünmäge synanyşaryn. “Javarash” kursynda söhbet edersiňiz. Bu düýbünden başga bir derejede, owadan, uly, köp wezipeli bolar. Emma ilki bilen hemişe binýady goýmaly, şonuň üçin bu ýerde şeýle bölümiň düýbüni tutýan zady anyklamaly. (Haýsydyr bir kemçilik ýa-da ýalňyşlyk tapsaňyz, premýer-ministrde ýa-da makalanyň aşagyndaky teswirde ýazyň). Başlalyň. Birinjisi: “Şol jaý ...” Serwer bilen bir müşderiniň arasynda tor baglanyşygynyň nädip ýüze çykýandygyny düşündirmek üçin geliň, häzirki ýaşaýyş jaýynyň nusgawy mysalyny alalyň. Müşderiniň belli bir serwer bilen haýsydyr bir baglanyşyk gurmalydygyny aýdalyň. Gözlegçi gözleg obýekti barada näme bilmeli? Hawa, salgy. Serwer bulutda jadyly bir zat däl, şonuň üçinem belli bir enjamda ýerleşmeli. Iki ylalaşylan tarapyň ýygnagy geçirilmeli jaý bilen meňzeşlikde. Kwartiraly jaýda biri-biriňizi tapmak üçin binanyň bir salgysy ýeterlik däl, ýygnagyň geçiriljek kwartirasynyň sanyny görkezmeli. Edil şonuň ýaly-da, bir kompýuterde birbada birnäçe serwer bolup biler we müşderiniň belli bir birine ýüz tutmagy üçin, birikmäniň ýüze çykjak port belgisini hem görkezmeli. Şeýlelik bilen, salgy we port belgisi. Salgy, internet giňişliginde maşyn kesgitleýjini aňladýar. Domen ady, mysal üçin "javarush.ru" ýa-da adaty IP bolup biler . Port- belli bir rozetka bilen baglanyşykly özboluşly san (bu termin soňrak ara alnyp maslahatlaşylar), başgaça aýdylanda, belli bir hyzmat bilen meşgullanýar, şonuň üçin onuň bilen habarlaşmak üçin ulanylýar. Şonuň üçin azyndan iki obýektiň biriniň (serweriň) çäginde duşuşmagy üçin sebitiň (serwer) eýesi (awtoulagda) belli bir kwartirany (porty), ikinjisi bolsa bilýän ýerini bilmeli; jaýyň salgysy (domen ýa-da ip), we kwartiranyň belgisi (port). Ikinji kelle: Soket bilen tanyşmak Torda işlemek bilen baglanyşykly düşünjeleriň we terminleriň arasynda iň möhüm biri Soketdir. Baglanyşygyň nokadyny aňladýar. Plyönekeý söz bilen aýdylanda, rozetka torda iki programmany birleşdirýär. Synp Socketrozetka ideýasyny durmuşa geçirýär. Müşderi we serwer giriş / çykyş kanallary arkaly habarlaşarlar: Socket we ServerSocket sapaklary ýa-da “Salam, serwer?  Eşidip bilersiňizmi? "  - 3 Bu synp müşderi tarapynda yglan edilýär we serwer birikme signalyny alýar. Onlaýn aragatnaşyk şeýle işleýär. Ilki bilen, mümkin synp gurluşykçylary Socket:
Socket(String Name_хоста, int порт) throws UnknownHostException, IOException
Socket(InetAddress IP-address, int порт) throws UnknownHostException
“Host_name” - belli bir tor düwünini, IP adresi aňladýar. Soket synpy ony hakyky, bar bolan adrese öwrüp bilmese, kadadan çykma bolar UnknownHostException. Port port. 0 port belgisi hökmünde görkezilen bolsa, ulgamyň özi mugt port bölüp berer. Baglanyşyk ýitirilen halatynda kadadan çykma hem bolup biler IOException. Ikinji konstruktordaky salgy görnüşiniň bardygyny bellemelidiris InetAddress. Mysal üçin, domen adyny salgy hökmünde görkezmeli bolanyňyzda halas edilýär. Mundan başga-da, bir domen birnäçe IP adresi aňladanda, InetAddressolary yzygiderli almak üçin ulanyp bilersiňiz. Şeýle-de bolsa, IP bilen hem işleýär. Şeýle hem, öý eýesiniň adyny, IP adresini düzýän baýt massiwini we ş.m. alyp bilersiňiz. Biraz öňe süreris, ýöne doly maglumat üçin resmi resminamalara gitmeli bolarsyňyz. Haýsydyr bir obýekt başlanda Socket, degişli müşderi torda belli bir salgyda we port belgisinde serwere birikmek isleýändigini habar berýär. Aşakda synpyň iň köp ulanylýan usullary bar Socket: InetAddress getInetAddress()- rozetka hakda maglumatlary öz içine alýan obýekti görkezýär. Soket birikdirilmedik bolsa - null int getPort()- serwere birikdirilen porty gaýtaryp berýär int getLocalPort()- rozetkanyň baglanan portuny yzyna berýär. Hakykat, müşderi we serwer bir portda “aragatnaşyk” edip biler, emma birikdirilen portlar düýbünden başgaça bolup biler boolean isConnected()- birikme gurlan bolsa hakyky gaýdyp geler void connect(SocketAddress address)- täze baglanyşygy görkezýär boolean isClosed()- rozetka ýapyk bolsa hakykata gaýdyp geler! boolean isBound()- rozetka adrese bagly bolsa, synp Socketinterfeýsi ýerine ýetirýär AutoCloseable, şonuň üçin ony ulanyp bolýar try-with-resources. Şeýle-de bolsa, ýakyn () ulanyp, rozetkany nusgawy görnüşde ýapyp bilersiňiz. Üçünji kelle: we bu “ServerSocket” diýeliň, synp görnüşinde Socketmüşderi tarapynda birikme haýyşyny yglan etdik. Serwer biziň islegimizi nädip çaklar? Munuň üçin serwerde şuňa meňzeş synp bar ServerSocketwe onda kabul etmek () usuly bar. Gurluşykçylary aşakda görkezilýär:
ServerSocket() throws IOException
ServerSocket(int порт) throws IOException
ServerSocket(int порт, int максимум_подключений) throws IOException
ServerSocket(int порт, int максимум_подключений, InetAddress локальный_address) throws IOException
Jarnamanyňyzda ServerSocket birikme salgysyny görkezmegiň zerurlygy ýok, sebäbi aragatnaşyk serwer enjamynda bolup geçýär. Diňe köp kanally host bilen serwer rozetkasynyň haýsy IP-e baglydygyny kesgitlemeli. “Head Three.One”: Nook diýýän serwer Programmany zerurlykdan has köp çeşme bilen üpjün etmek gaty gymmat we manysyz, şonuň üçin konstruktorda ServerSocketiş wagtynda serwer tarapyndan kabul edilen iň ýokary birikmeleri yglan etmegiňizi haýyş edýäris. Görkezilmedik bolsa, onda bu san 50-e deň hasap ediler. Hawa, teoriýa boýunça ServerSocketmunuň diňe bir serwer üçin şol bir rozetkadygyny çaklap bileris. Emma synpdan düýbünden başga bir rol oýnaýar Socket. Diňe baglanyşyk döretmek tapgyrynda zerur. Bir görnüşli obýekt döredeniňizden soň, ServerSocketkimdir biriniň serwere birikmek isleýändigini anyklamaly. Kabul etmek () usuly şu ýerde baglanyşdyrylýar. Maksat, kimdir biri oňa birikmek isleýänçä garaşýar we bu ýüze çykanda bir görnüşli obýekti Socket, ýagny döredilen müşderi rozetkasyny yzyna gaýtaryp berýär. Indi serwer tarapynda müşderi rozetkasy döredilensoň, iki taraplaýyn aragatnaşyk başlap biler. SocketMüşderi tarapynda görnüşli obýekt döretmek we ServerSocketserwer tarapyny ulanyp täzeden döretmek, birikmek üçin zerur bolan iň az zat. Dördünji kelle: Santa Klausa hat Вопрос: Müşderi we serwer nädip aragatnaşyk saklaýar? Ответ:I / O akymlary arkaly. Bizde eýýäm näme bar? Serweriň salgysy we müşderiniň port belgisi bolan rozetka, we şol bir zat, kabul edişiňiz sebäpli (), serwer tarapynda. Şonuň üçin rozetka arkaly habarlaşarlar diýip çaklamak ýerliklidir. Munuň üçin akymlara InputStreamwe OutputStreamgörnüşdäki zatlara girmäge mümkinçilik berýän iki usul bar Socket. Ine:
InputStream getInputStream()
OutputStream getOutputStream()
Arealaňaç baýtlary okamak we ýazmak beýle bir täsirli däldigi sebäpli, akymlar adapter sapaklaryna örtülip bilner, buferlener ýa-da bolmaz. Mysal üçin:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Aragatnaşygyň iki taraplaýyn bolmagy üçin şeýle amallar iki tarapdan hem edilmelidir. Indi ulanyp bir zat iberip, ulanyp bir zat alyp bilersiňiz we tersine. Aslynda bu synpyň ýeke-täk wezipesi Socket. Hawa, flush () usulyny ýatdan çykarmaň BufferedWriter- buferiň mazmunyny ýuwýar. Bu edilmese, maglumat berilmez we şonuň üçin alynmaz. Alýan sapak ahyrky görkezijä garaşýar - “\ n”, ýogsam habar kabul edilmez, aslynda habar gutarmaýar we doly däl. Bu size oňaýsyz ýaly görünýän bolsa, alada etmäň, elmydama gutarmaly PrintWriter, ikinji argument hökmünde hakykaty görkezmeli we buferden çykmak awtomatiki ýagdaýda ýüze çykyp biler:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
Mundan başga-da, setiriň soňuny görkezmegiň zerurlygy ýok, bu synp siziň üçin edýär. Iöne I / O setir rozetkanyň edip biljek zadynyň çägimi? , Ok, rozetka akymlary arkaly obýekt ibermek isleýärsiňizmi? Hudaýyň hatyrasyna. Olary seriallaşdyryň we gitmek gowy:
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Bäşinji kelle: Internet arkaly hakyky aragatnaşyk Hakyky tor arkaly hakyky IP adresi bilen birikmek üçin doly hukukly serwer bolmaly we şondan bäri:
  1. Geljekki söhbetdeşligimiz, peýdaly hökmünde beýle ukyplara eýe däl. Diňe baglanyşyk gurup we habar alyp / iberip biler. .Agny, hakyky serwer mümkinçilikleri ýok.
  2. Diňe rozetka maglumatlary we I / O akymlaryny öz içine alýan serwerimiz hakyky WEB ýa-da FTP serweri bolup bilmez, diňe şonuň bilen internet arkaly birigip bilmeris.
Mundan başga-da, hakyky ulgam bilen derrew işlemek üçin durnukly däldigini aňladýan programmany ösdürip başlaýarys, şonuň üçin ýerli hosty birikme salgysy hökmünde ulanarys. .Agny, teoriýa boýunça müşderi we serwer henizem rozetkadan başga hiç hili baglanyşyk bolmaz, emma programmany düzetmek üçin torda hakyky aragatnaşyk bolmazdan şol bir enjamda bolarlar. Konstruktorda Socketsalgynyň ýerli bolandygyny görkezmek üçin 2 ýol bar:
  1. Localerli stub manysyny berýän salgy salgysy hökmünde “localhost” ýazyň. “127.0.0.1” hem munuň üçin amatly - bu diňe stubyň sanly görnüşidir.
  2. InetAddress ulanmak:
    1. InetAddress.getByName(null)- “localhost” -a null nokatlar
    2. InetAddress.getByName("localhost")
    3. InetAddress.getByName("127.0.0.1")
Ityönekeýlik üçin “String” görnüşli “ýerlihost” ulanarys. Otheröne beýleki ähli wariantlar hem işleýär. Altynjy baş: Gepleşigiň wagty geldi Şeýlelik bilen, serwer bilen söhbetdeşlik sessiýasyny durmuşa geçirmek üçin eýýäm zerur zatlarymyz bar. Galan zat, ony bir ýere jemlemek: Aşakdaky sanawda müşderiniň serwere nädip birikýändigini, oňa bir habar iberýändigini görkezýär we serwer hem öz gezeginde habary argument hökmünde ulanyp alandygyny tassyklaýar: "Serwer. java "
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);
        }
    }
"Müşderi.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);
        }

    }
}
Elbetde, ilki serweri başlamaly, sebäbi müşderi ony birikdirjek bir zat bolmasa, başlangyçda nämä biriker? :) Çykyş şeýle bolar: / * Bir zat aýtmak islediňizmi? Bu ýere giriň: Salam, serwer? Meni eşidip bilersiňizmi? Salam, bu Serwer! Tassyklaýaryn, sen ýazdyň: Salam, serwer? Meni eşidip bilersiňizmi? Müşderi ýapyldy ... * / Hurray! Serwer bilen müşderi bilen aragatnaşyk saklamagy öwretdik! Aragatnaşyk iki nusgada däl-de, isleýşiňiz ýaly sapaklaryň okalmagyny we ýazylmagyny wagtlaýyn (hakyky) aýlaw bilen örtüň we çykyş üçin belli bir habara görä, mysal üçin “çykyş” görkeziň , aýlaw kesildi we programma gutarardy. Sevenedinji kelle: Köp ulanyjy has gowudyr. Serweriň bizi eşidip biljekdigi hakykatdanam gowy, ýöne öz görnüşimizdäki biri bilen gürleşip bilsek has gowy bolardy. Makalanyň ahyrynda ähli çeşmeleri goşaryn, şonuň üçin bu ýerde elmydama uly däl, möhüm kod böleklerini görkezerin, bu dogry ulanylsa, köp ulanyjy söhbetdeşligini döretmäge mümkinçilik berer. Şeýlelikde, serwer arkaly başga bir müşderi bilen aragatnaşyk gurmak isleýäris. Muny nädip etmeli? Elbetde, müşderi programmasynyň öz usuly bar main, bu serwerden aýratyn we beýleki müşderiler bilen parallel işe girizilip bilner. Bu bize näme berýär? Her niçigem bolsa, her täze baglanyşyk bilen serweriň derrew aragatnaşyga girmezligi, ýöne bu baglanyşygy haýsydyr bir sanawa ýazmagy we täze birikmä garaşmagy dowam etdirmegi zerurdyr we haýsydyr bir kömekçi hyzmat belli bir aragatnaşyk bilen meşgullanýar. Müşderi. Müşderiler serwere ýazmaly we biri-birine garaşsyz jogap garaşmaly. Sapaklar kömege gelýär. Täze baglanyşyklary ýatda saklamak üçin jogapkär synpymyz bar diýeliň: Onda aşakdaky görkezilenler bolmaly:
  1. Port belgisi
  2. Täze baglanyşygy ýazýan sanawy.
  3. ServerSocketBir (!) Göçürmede .
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();
        }
    }
}
Bolýar, indi her bir döredilen rozetka ýitirilmez, serwerde saklanar. Mundan başga-da. Her bir müşderi diňlemek üçin birine mätäç. Soňky bapdan serwer funksiýalary bilen bir sapak döredeliň.
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) {}
    }
}
Şeýlelik bilen, serwer sapagynyň konstruktorynda sapagyň belli bir müşderi bilen habarlaşjak rozetkasy bolmaly. Şeýle hem I / O sapaklar we beýleki zatlary gönüden-göni konstruktordan başlamaly. Bolýar, ýöne serwer sapagy müşderiniň habaryny okanda näme bolýar? Diňe müşderiňize iberiň? Örän täsirli däl. Köp ulanyjy söhbet edýäris, şonuň üçin bir adamyň ýazan zatlaryny almak üçin her bir birikdirilen müşderi gerek. Müşderileri bilen baglanyşykly ähli serwer sapaklarynyň sanawyny ulanmaly we iberilen her habary belli bir sapaga iberip, müşderisine ibermeli:
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) {}
}
Indi ähli müşderiler olaryň biriniň näme diýendigini bilerler! Habary iberen adama iberilmegini islemeýän bolsaňyz (ýazanlaryny eýýäm bilýär!), Diňe sapaklar bilen gaýtalananda, bir obýekt gaýtadan işlenilende, aýlaw ýerine thisýetirilmezden indiki elemente geçjekdigini kesgitläň boýunça islendik hereket. Ora-da isleseňiz, müşderä habaryň üstünlikli kabul edilendigini we iberilendigini habar iberiň. Serwer bilen hemme zat düşnükli. Müşderä, has dogrusy müşderilere geçeliň! Ol ýerde hemme zat birmeňzeş, soňky bapdan müşderi bilen meňzeşlikde, diňe konstruktorda zerur zatlary döretmek üçin serwer bilen bu bapda görkezilişi ýaly zerur mysal döredilende. Aöne, müşderi döredilende, entek hiç zada girmäge wagty ýok, ýöne oňa bir zat iberilen bolsa näme etmeli? (Mysal üçin, öňünden söhbetdeşlige birikdirilenleriň hat alyşma taryhy). Şeýlelik bilen iberilen habarlaryň gaýtadan işlenjek siklleri habarlary konsoldan okalýan we başgalaryna ugratmak üçin serwere iberilýänlerden aýrylmalydyr. Saplar ýene kömege gelýär. Müşderi sapak hökmünde döretmegiň manysy ýok. Habarlary okaýan, şeýle hem meňzeşlik bilen ýazýan ylgaw usulynda aýlawly sapak ýasamak has amatlydyr:
// 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) {

            }

        }
    }
}
Müşderi konstruktorynda diňe bu sapaklary başlamaly. Müşderiniň gitmek isleýän bolsa, çeşmelerini nädip ýapmaly? Serwer sapak çeşmelerini ýapmalymy? Munuň üçin habar aýlawyndan çykanyňyzda çagyrylýan aýratyn usul döretmeli bolarsyňyz. Şol ýerde rozetka we I / O akymlaryny ýapmaly bolarsyňyz. Belli bir müşderi üçin şol bir sessiýa gutarnykly signaly, rozetkasy bilen edil şonuň ýaly etmeli we esasy serwer synpyndaky sapaklaryň sanawyndan özüni aýyrmaly serwer sapagyna iberilmelidir. Sekizinji baş: Kämillik üçin çägi ýok Taslamaňyzy gowulandyrmak üçin tükeniksiz täze aýratynlyklary oýlap tapyp bilersiňiz. Newlyöne täze birikdirilen müşderä takyk nämäni geçirmeli? Meniň pikirimçe, soňky on waka gelmezinden öň bolup geçdi. Munuň üçin islendik serwer sapagy bilen iň soňky hereketiň yglan edilen sanawa girjek synpyny döretmeli we sanaw eýýäm doly bolsa (ýagny eýýäm 10 bar), birinjisini pozuň we goşuň iň soňky gelen. Bu sanawyň mazmunyny täze baglanyşyk arkaly almak üçin, serwer sapagyny döredeniňizde, çykyş akymynda olary müşderä ibermeli. Muny nädip etmeli? Mysal üçin, şuňa meňzeş:
public void printStory(BufferedWriter writer) {
// ...
}
Serwer sapagy eýýäm akymlary döretdi we çykyş akymyny argument hökmünde geçirip biler. Ondan soň, gözleg siklinde täze müşderä geçirilmeli zatlaryň hemmesini geçmeli. Netije: Bu diňe esaslar we hakyky programma döredilende bu söhbetdeşlik arhitekturasy işlemez. Bu programma bilim maksatlary üçin döredildi we onuň esasynda müşderini serwer bilen nädip aragatnaşyk gurup biljekdigiňizi (we tersine), muny birnäçe baglanyşyk üçin nädip etmelidigini we elbetde, rozetkalarda nähili gurnalandygyny görkezdim. Çeşmeler aşakda tertipleşdirildi we derňelýän programmanyň deslapky kody hem goşuldy. Bu makala ýazmakda ilkinji tejribäm) Üns bereniňiz üçin sag boluň :)
  1. Java Enterprise-de pikirlenmek, Brýus Ekel we başg. Al. 2003
  2. Java 8, Doly gollanma, Herbert Şildt, 2017-nji ýylyň 9-njy neşiri (22-nji bap)
  3. Soketler hakda Java makalasynda soket programmirleme
  4. Resmi resminamalarda rozetka
  5. Resmi resminamalarda ServerSocket
  6. GitHub-daky çeşmeler
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION