Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Chat, Socket 
V
    Опции темы
hagerds
Дата 14.2.2012, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



Всем привет!!!.

пишу чат. его логика работы должна выглядит так:
множество клиентов (использую пока telnet) подключаются к серверу. каждый клиент передаёт в консоль сервера строку.  сервер в свою очередь, при нажатии на кнопку "одному" отсылает сообщение i-му клиенту. клавиша "всем" должна отсылать строку всем подключенным пользователям. 

1)метод getPort() класса Socket возращает удалённый порт. есть ли в api что-то типа setPort()для передачи по удалённому порту, сам искал подходящего не нашел. у кого какие мысли есть по этому поводу?

реализация на клавишу "всем",без статика не работать и пересылается почему-то только последнему, а предыдущий пользователь игнорится.
2)реализация кода по нажатию клавишь хоть правильная? smile  smile  smile может стоит создать по однаму потоку на нажатие каждой кламиши?
Код

import java.awt.FlowLayout;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.swing.*;


public class ServerTest {
    public ServerTest(){
        JFrame frame = new JFrame("сервер");
        JPanel panel = new JPanel();
        
        JButton button1 = new JButton("одному");
        JButton button2 = new JButton("всем");
        
        button1.addActionListener( new ActionListener(){
        int i =0;
        public void actionPerformed(ActionEvent arg0) {
            
            System.out.println("message!\n{massege"+(++i)+"}\n");
            Chat.out.println("message"+i);
            //???
            
            }});
        button2.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            //???
        }});
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel.add(button1);
        panel.add(button2);
        frame.add(panel);
           
        frame.pack();
        frame.setVisible(true);
        
        try {
            
            ServerSocket sock = new ServerSocket(9999);
            int i=0;
            while(true){
                Socket s = sock.accept();
                Thread t = new Chat(s,(++i));
                t.start();
                System.out.println("Клиент "+i);
            }
        } catch (IOException e) {e.printStackTrace();}
    }

    public static void main(String[] args) {
        
        ServerTest st = new ServerTest();
    }
    
}
class Chat extends Thread{
    public Chat(Socket sock,int i){
        this.sock = sock;
        this.i = i;
    }
    public void run(){
        try {
            Scanner in = new Scanner(sock.getInputStream());
            out = new PrintWriter(sock.getOutputStream(),true);
            
            out.println( "Hello! Enter BYE to exit." );
            
            boolean done = true;
            while (done)
            { 
                String str = in.nextLine();
                if (str != null) 
                {
                    out.println("Echo (" + i + "): " + str);
                    System.out.println(sock.toString() + " " + str);
                    if (str.trim().equals("BYE")){
                     done = false;
                  } 
                }
            }
            sock.close();
        } catch (IOException e) {e.printStackTrace();}
    }
    private Socket sock;
    private int i = 0;
    public  PrintWriter out;
}

 
с сокетами и патоками недавно познакомился. успел за это время запутаться и сварить в голове кашу.smile  smile  smile

помогите пожалуста разобраться.  smile  smile  smile 

PM MAIL   Вверх
LSD
Дата 14.2.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Начни с All About Sockets.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
hagerds
Дата 16.2.2012, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



проблему решил! надо было всего лишь создать массив клиентских потоков.  smile  smile  smile 
вот код если кому понадобиться smile 
Код

import java.awt.FlowLayout;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;


public class ServerTest {
    ServerTest(){
        JFrame frame = new JFrame("сервер");
        JPanel panel = new JPanel();
        
        JButton button1 = new JButton("одному");
        JButton button2 = new JButton("всем");
        
        button1.addActionListener( new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            for(Chat client: clientList){
                System.out.println(client.sock.getPort());
            }
            int port = Integer.parseInt(
                    JOptionPane.showInputDialog(
                            "Введите порт i-го клиента!"));
            for(Chat client:clientList){
                if(client.sock.getPort()==port){
                    client.out.println("Server! massege");
                }
            }
            }});
        button2.addActionListener(new ActionListener(){
        int i = 0;
        public void actionPerformed(ActionEvent arg0) {
            i++;
            System.out.println("Server!{massege №"+i+"}\n");
            for(Chat client: clientList){
                client.out.println("Server! massege №"+i);
            }
        }});
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel.add(button1);
        panel.add(button2);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        
        try {
            
            ServerSocket sock = new ServerSocket(9999);
            int i=0;
            while(true){
                Socket s = sock.accept();
                t = new Chat(s,(++i));
                clientList.add((Chat) t);
                t.start();
                System.out.println("Вход. Клиент "+i+": "+s.getPort());
            }
        } catch (IOException e) {e.printStackTrace();}
    }

    public static void main(String[] args) {
        new ServerTest();
    }
    
    static ArrayList<Chat> clientList =  new ArrayList<Chat>();
    static Thread t;
}
class Chat extends Thread{
    Chat(Socket sock,int i){
        this.sock = sock;
        this.i = i;
    }
    Socket getSocket(){
        return sock;
    }
    int getIndex(){
        return i;
    }
    
    public void run() {
        try {
            in = new Scanner(sock.getInputStream());
            out = new PrintWriter(sock.getOutputStream(),true);
            
            out.println( "Hello! Enter BYE to exit." );
            
            while (true)
            { 
                String str = in.nextLine();
                if (str != null) 
                {
                    out.println("Echo (" + i + "): " + str);
                    System.out.println("Клиент " + i + ": " + str);
                    if (str.trim().equals("BYE"))
                     break;
                }
            }
        } catch (IOException e) {e.printStackTrace();}
        finally{
            
            in.close();
            out.close();
            try {
                Disconnect(sock.getPort());
                sock.close();
            } catch (IOException e) {e.printStackTrace();}
        }
    }
    
    void Disconnect(int port){
        
        ArrayList<Chat> newList =  new ArrayList<Chat>();
        for(Chat client: ServerTest.clientList){
            if(client.sock.getPort() != port){
                newList.add(client);
            }
        }
        ServerTest.clientList = newList;
        ServerTest.t.stop();
    }
    private Scanner in;
    private int i = 0;
    Socket sock;
    PrintWriter out;
}



и последний вопрос после чего можно закрывать тему.

хочу услышать критику архитектуры кода. не лучше былоб класс  Chat вынести в отдельный файл? и т.д.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.