Serve Socket – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Serve Socket – Java – Fórum – Programujte.comServe Socket – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Whowky0
Newbie
23. 7. 2013   #1
-
0
-

Ahoj, v jave se snažím o úplně jednoduchou komunikaci klient server pomocí socketů. Server spustím, spustím klienta, server vypíše že se klient připojil, pošlu zprávu, server jí vypíše. Můj problém nastává, když se klientů připojí víc. Klient který je první v ArrayListu muže psát kolik chce a server to vypisuje, ale pokud něco napíše klient spustěný jako druhý jeho text se vypíše až po odeslání zprávy od klienta číslo jedna. Pokud se připojí klienti tři je v tom chaos ještě větší. Mě už nic nenapadá tak bych byl vděčný za každé nakopnutí správným směrem. Předem dík.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server2 {
    
    private ServerSocket serverSocket;
    private ArrayList<BufferedReader> listOfBuffer = new ArrayList<>();
    private static int port = 9939;
    
    public Server2() {
        try {
            serverSocket = new ServerSocket(port);
            listen();
        }catch(IOException ex) {
            System.out.println(ex);
        }
    }
    
    private void clientListen() {
        try {
            Socket clientSocket = serverSocket.accept();
            listOfBuffer.add(new BufferedReader(new InputStreamReader
                    (clientSocket.getInputStream())));
            System.out.println("client: " 
                    + clientSocket.getInetAddress().getHostAddress()
                    + " has been connection");
        }catch(IOException ex) {
            System.out.println(ex);
        }
    }
    
    private synchronized void dataRead() {
        for(int i = 0; i<listOfBuffer.size(); i++) {
            try {
                BufferedReader br = listOfBuffer.get(i);
                String data = br.readLine();
                if(data == null) {               
                    listOfBuffer.remove(i);
                }else {
                    System.out.println(data);
                }
            }catch(IOException ex) {
                System.out.println(ex);
            }
        }
    }
    
    private void listen() {
        Thread vlakno1 = new Thread(new Runnable() {

            @Override
            public void run() {
                while(true) {
                    clientListen();
                }
            }
        });
        vlakno1.start();
        
        while(true) {
            dataRead();
        }
    }
    
    public static void main(String[] args) {
        Server2 server = new Server2();
    }
}
Nahlásit jako SPAM
IP: 93.91.49.–
liborb
~ Redaktor
+18
Guru
24. 7. 2013   #2
-
0
-

Nejspíš je to tím, že soket je blokující.

Nahlásit jako SPAM
IP: 188.75.135.–
Whowky0
Newbie
24. 7. 2013   #3
-
0
-

#2 liborb

Co vím tak blokující je "serverSocket.accept();" a tím bych řekl že to není, protože pokaždé když připojím dalšího klienta server okamžitě reaguje výpisem.

Nahlásit jako SPAM
IP: 93.91.49.–
KIIV
~ Moderátor
+43
God of flame
24. 7. 2013   #4
-
0
-

#3 Whowky
to muze byt zpusobeno tim, ze to mas v separatnim threadu

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Whowky0
Newbie
26. 7. 2013   #5
-
0
-

Vyřešeno pomocí ServerSocketChannel a nastavení jako neblokující socket. Dík za rady   

Nahlásit jako SPAM
IP: 93.91.49.–
Whowky0
Newbie
6. 8. 2013   #6
-
0
-

   

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class ChatServer {
    
    private ServerSocketChannel serverSocketChannel;
    private ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
    private Selector selector;
    private Set<SelectionKey> keys;
    private static final int PORT = 9939;
    
    protected void start() {
        try {
            serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.configureBlocking(false);
            serverSocketChannel.socket().bind(new InetSocketAddress(PORT));
            selector = Selector.open();
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
            
            while(serverSocketChannel.isOpen()) {
                selector.select();
                keys = selector.selectedKeys();
                Iterator<SelectionKey> i = keys.iterator();
                while(i.hasNext()) {
                    SelectionKey key = i.next();
                    i.remove();
                    Channel chan = key.channel();
                    if(chan == serverSocketChannel) {
                        SocketChannel client = serverSocketChannel.accept();
                        if(client != null) {
                            client.configureBlocking(false);
                            client.register(selector, SelectionKey.OP_READ);
                        }
                    }else {
                        SocketChannel client = (SocketChannel) chan;
                        int read = 0;
                        while(read >= 0) {
                            buffer.rewind();
                            read = client.read(buffer);
                            buffer.rewind();
                            for(int j = 0; j < read; j++) {
                                System.out.print((char)buffer.get(j));
                            }
                        }
                    }
                }
            }
        }catch (IOException ex) {
            System.out.println(ex);
        }
    }
    
    public static void main(String[] args) {
        new ChatServer().start();
    }
}


Sice pozdě, ale kdyby někdo chtěl zdroják...

Nahlásit jako SPAM
IP: 93.91.49.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

C++ socket — založil Dominik Rozporka

Socket — založil Damian

Socket — založil janek

Socket — založil cniry

Socket — založil Michal Baloun

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý