Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
Федя Форточкин
69 / 83 / 33
Регистрация: 09.12.2012
Сообщений: 222
Записей в блоге: 3
1

Чат на сокетах

05.05.2013, 16:49. Просмотров 7747. Ответов 13
Метки нет (Все метки)

Начал работу с сетью, пробую написать небольшой чат на tcp сокетах, на стороне сервера всё нормально, он отправляет всем клиентам, но вот клиенты принимают сообщение только после посылки некоторого сообщения, в чём проблема я знаю, а как её решить нет, пробовал чтение сообщений вынести в отдельный поток, становилось только хуже, подскажите, что можно с этим сделать?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.net.*;
import java.io.*;
import java.util.*;
class SampleClient extends Thread
{
     Socket s;
     static BufferedReader in;
     public static void main(String args[])
    {
        try
        {
            Socket s = new Socket("localhost", 3128);
            Scanner input = new Scanner(System.in);
        String str;
        while(!(str = input.nextLine()).equalsIgnoreCase("exit")) {
        s.getOutputStream().write(str.getBytes());
            byte buf[] = new byte[64*1024];
            int r = s.getInputStream().read(buf);
            String data = new String(buf, 0, r);
            System.out.println(data);
    }
        }
        catch(Exception e)
        {System.out.println("init error: "+e);} 
    
}
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 16:49
Ответы с готовыми решениями:

Консольный чат Клиенты-Сервер на сокетах
При отправки сообщения клиентом, оно приходит только серверу, а как сделать, чтобы оно приходило...

Чат на сокетах
Я создаю чат на С ++, только такой в котором 1 сервер который как и клиент также может отправлять и...

Чат на сокетах
Есть сервер и клиент когда отправляешь сообщение с первого клиента втором то сообщения не...

Чат на сокетах
Здравствуйте, форумчане. Сейчас занялся написанием чата на сокетах. Всё вроде бы хорошо, но уперся...

Чат на сокетах
Проблема в работе чата: отправляется только первое сообщение, а дальше всё зависает....

13
tabber
06.05.2013, 15:23
  #2

Не по теме:

Java
1
class SampleClient extends Thread
где вас делают

0
Freeman666
9 / 35 / 7
Регистрация: 04.03.2013
Сообщений: 184
06.05.2013, 16:01 3
Приведите код клиента и сервера и тогда уже будет о чём говорить.
А вообще вот
http://www.javaportal.ru/java/articles/ClientServer.html
или вот
http://ski-android.blogspot.com/2012/06/java.html
ну или вот
http://www.conlex.kz/primer-prilozheniya-klientserver-na-yazyke-java/
0
Федя Форточкин
69 / 83 / 33
Регистрация: 09.12.2012
Сообщений: 222
Записей в блоге: 3
06.05.2013, 18:11  [ТС] 4
Freeman666, клиент:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.net.*;
import java.io.*;
import java.util.*;
class SampleClient extends Thread
{
     Socket s;
     static BufferedReader in;
     public static void main(String args[])
    {
        try
        {
            Socket s = new Socket("localhost", 3128);
            Scanner input = new Scanner(System.in);
        String str;
        while(!(str = input.nextLine()).equalsIgnoreCase("exit")) {
        s.getOutputStream().write(str.getBytes());
            byte buf[] = new byte[64*1024];
            int r = s.getInputStream().read(buf);
            String data = new String(buf, 0, r);
            System.out.println(data);
    }
        }
        catch(Exception e)
        {System.out.println("init error: "+e);} 
    
}
}
сервер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.net.*;
import java.io.*;
import java.util.*;
class SampleServer extends Thread
{
    static Socket s;
    int num;
    static ArrayList<Socket> users = new ArrayList<Socket>();
    public static void main(String args[])
    {
        try
        {
            int i = 0; 
 
            ServerSocket server = new ServerSocket(3128, 0,
                    InetAddress.getByName("localhost"));
 
            System.out.println("server is started");
 
 
            while(true)
            {
                s = server.accept();
                users.add(s);
                new SampleServer(i, s);
                i++;
            }
        }
        catch(Exception e)
        {System.out.println("init error: "+e);} 
    }
 
    public SampleServer(int num, Socket s)
    {
 
        this.num = num;
        this.s = s;
        setDaemon(true);
        setPriority(NORM_PRIORITY);
        start();
    }
 
    public void run()
    {
        try
        {
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            byte buf[] = new byte[64*1024];
        int r;
            while(/*(r = is.read(buf)) != -1*/true) {
            r = is.read(buf);
            String data = new String(buf, 0, r);
            data = ""+num+": "+""+data;
            //os.write(data.getBytes());
        for(int z = 0; z < users.size(); z++) {
        Socket ghost = users.get(z);
        //if (ghost.isConnected()) {
            ghost.getOutputStream().write(data.getBytes()); 
        //} else {
            //users.remove(z);
        //}
        }
            }
            //s.close();
        }
        catch(Exception e)
        {System.out.println("init error: "+e);} // вывод исключений
     
}
}
тут всё работает, только надо как-то сделать так чтобы клиент читал информацию паралельно от записи. пробовал вынести в отдельный поток, становилось ещё хуже
0
06.05.2013, 18:11
Freeman666
9 / 35 / 7
Регистрация: 04.03.2013
Сообщений: 184
06.05.2013, 18:16 5
Цитата Сообщение от Федя Форточкин Посмотреть сообщение
тут всё работает, только надо как-то сделать так чтобы клиент читал информацию паралельно от записи.
Я к сожалению не понимаю что это означает.
0
tabber
36 / 40 / 3
Регистрация: 10.10.2010
Сообщений: 364
06.05.2013, 18:51 6
я вам советую почитать на офф сайте документацию по этим классам и потокам.
у вас тут поток который вообще по сути при такой архитектуре не нужен. вдабавок наследующий Thread не пойми зачем. Возможно тогда и проблем не будет
0
Федя Форточкин
69 / 83 / 33
Регистрация: 09.12.2012
Сообщений: 222
Записей в блоге: 3
07.05.2013, 00:06  [ТС] 7
tabber, наследование от Thread осталось от того раза когда я это пытался в поток запихнуть, проблема в том, что он сначала принимает из консоли строку, потом её посылает, и только потом начинает читать то что написали на других сокетах, а надо сделать отправку и чтение паралельными, может создать таймер, предположим на каждые 500 миллисекунд, чтобы он через данный промежуток времени проверял наличие новых сообщений?

P.S. документацию уже читал.........
0
Freeman666
9 / 35 / 7
Регистрация: 04.03.2013
Сообщений: 184
07.05.2013, 00:15 8
Как только сервер получает новое сообщение, то сразу отвечает всем клиентам, вот и всё.
0
Федя Форточкин
69 / 83 / 33
Регистрация: 09.12.2012
Сообщений: 222
Записей в блоге: 3
07.05.2013, 00:22  [ТС] 9
Freeman666, с серваком всё нормально!!! На стороне клиента проблема были, решил уже через таймер....
0
tabber
36 / 40 / 3
Регистрация: 10.10.2010
Сообщений: 364
07.05.2013, 17:01 10
я советую относительно потоков реализовать Runnable. ну просто не зачем расширят какой-то класс
0
mutagen
2568 / 2241 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
07.05.2013, 17:39 11
Цитата Сообщение от Федя Форточкин Посмотреть сообщение
решил уже через таймер....
это неправильное решение, вы сделали по сути 1 поточный сервер с временным разделением приёма-передачи, чёт типа рации
тогда как нормальный мультипоточный сервер может обслуживать кучу клиентов паралельно
0
Федя Форточкин
69 / 83 / 33
Регистрация: 09.12.2012
Сообщений: 222
Записей в блоге: 3
09.05.2013, 01:20  [ТС] 12
mutagen, сервер итак мультипоточный, клиент паралельно от посылки не принимал сообщения, я таймер не на сервер а на клиент поставил
0
Freeman666
9 / 35 / 7
Регистрация: 04.03.2013
Сообщений: 184
09.05.2013, 15:57 13
Таймер на клиент? Можно взглянуть на код?
0
Федя Форточкин
69 / 83 / 33
Регистрация: 09.12.2012
Сообщений: 222
Записей в блоге: 3
11.05.2013, 01:37  [ТС] 14
Freeman666, я те файлы удалил, уже и не помню, вроде так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
class Client extends Thread
{
     final Socket s = null;
     static BufferedReader in;
     public static void main(String args[])
    {
        try
        {
            Socket s = new Socket("localhost", 3128);
            Scanner input = new Scanner(System.in);
        String data = null;
        javax.swing.Timer timer = new javax.swing.Timer(500, new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                   
               } 
            });
            timer.start();
        String str;
        while(!(str = input.nextLine()).equalsIgnoreCase("exit")) {
        s.getOutputStream().write(str.getBytes());
    }
        }
        catch(Exception e)
        {System.out.println("init error: "+e);} 
    
}
}
0
11.05.2013, 01:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 01:37

Чат на сокетах
Здравствуйте. Решил написать не большой чат на JAVA. Опыта работы в JAVA немного. Собственно решил...

Чат на сокетах
Здравствуйте, хочу сделать чат на PHP с использованием сокетов. С самими сокетами я познакомился,...

Чат на сокетах
Здрасьте. Знаю, что тема до невозможности бородатая, но возникла необходимость создания программы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru