Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
1 / 1 / 3
Регистрация: 04.06.2013
Сообщений: 48

ServerSocket & Socket

10.08.2013, 12:10. Показов 3376. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот пытаюсь написать чат который сможет принимать более одного клиента. Сервер, вроде, работает нормально а вот с клиентом беда(( Насколько я знаю через один и тот же порт можно подключаться много раз. Когда я запускаю первый клиент, то все работает нормально, но когда запускаю второй выскакивает вот такое:

Но сообщение каким-то чудом передается!

Server
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication4;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author Admin
 */
 
 
public class JavaApplication4 {
 
    public static void main(String[] args) throws InterruptedException{
 
        Socket client = null;
        ServerSocket server;
        
        try{
            server = new ServerSocket(serverPort);
            
            while(true){
                client = server.accept();
                InetAddress ip = client.getInetAddress();
                ipList.add(ip.getHostAddress());
 
                DataInputStream in = new DataInputStream(client.getInputStream());
 
                String ClientMessage = in.readUTF();
 
                if(ClientMessage.equals(""))
                    continue;
                
                JavaApplication4 j = new JavaApplication4();
                OutThread Out = j.new OutThread(ClientMessage);
                Out.start();
            }
        }catch(IOException e){
            System.out.println("Connection is lost..");
        }finally{
            if(client != null){
                try{
                    client.close();
                }catch(IOException e){
                    System.out.println("Cant close client socket!");
                }
            }
        }
        
    }
    public static int serverPort = 7777;
    public static int chatPort = 8888;
    public static String serverIp = "127.0.0.1";
    public static BufferedReader keyboard;
    public static ArrayList<String> ipList = new ArrayList<>();
    
    private class OutThread extends Thread{
        public OutThread(String message){
            this.message = message;
        }
        
        public void run(){
            try{
                for(String ip : ipList){
                    sock = new Socket(ip,chatPort);
                    out = new DataOutputStream(sock.getOutputStream());
                    out.writeUTF(message);
                    out.flush();
                }
            }catch(IOException ex){
                    ex.printStackTrace();
                }finally{
                try {
                    out.flush();
                    out.close();
                    sock.close();
                } catch (IOException ex) {
                    Logger.getLogger(JavaApplication4.class.getName()).log(Level.SEVERE, null, ex);
                }
                }
        }
        
        private String message; 
        private DataOutputStream out;
        private Socket sock;
    }
}
Client
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
72
73
74
75
76
77
78
79
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Client;
 
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author Admin
 */
 
public class Client {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args){
        Socket client = null;
        
        DataOutputStream out = null;
        try{
            client = new Socket(serverIp,serverPort);
            Client clientClass = new Client();
            inThread inThreadClass = clientClass.new inThread();
            inThreadClass.start();
            keyboard = new BufferedReader(new InputStreamReader(System.in));
            while(true)
            {
                out = new DataOutputStream(client.getOutputStream());     
                String ServerMessage = keyboard.readLine();
            
                out.writeUTF(ServerMessage);
                out.flush();
            }
            
        }catch(IOException e){
            System.out.println("Connection is lost..");
        }finally{
            if(client != null)
                try{
                    client.close();
                }catch(IOException e){
                    System.out.println("Cant close client socket!");
                }
        }
        
 
    }
    
    public static int serverPort = 7777;
    public static int chatPort = 8888;
    public static String serverIp = "127.0.0.1";
    public static BufferedReader keyboard;
    
    private class inThread extends Thread{
        public void run(){
            try {
                ServerSocket server = new ServerSocket(chatPort); //Что-то здесь не так
                DataInputStream in;
                while(true)
                {
                    Socket sock = server.accept();
                    in = new DataInputStream(sock.getInputStream());
                    String temp = in.readUTF();
                    System.out.println(temp);
                    sock.close();
                    in.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2013, 12:10
Ответы с готовыми решениями:

Невозможно создать Socket: Socket sock = new Socket(someHostString,somePortInt);
Народ! Помогите пожалуйста. Вся красота губится на exception что выскакивает в момент создания сокета: Socket sock = new...

Использование ServerSocket.Socket.Connections[i]
Люди!!! Помогите плиз! Я никак не могу въехать в работу Соккетов. Я посмотрел Чат, который поставляется с Дельфи, но там проблема в том,...

Ошибка при ServerSocket.Socket.RemoteAddress
Добрый день, господа. Вчера я перешел на дельфи. Пытался сделать чат, но он получился односторонний(Сервер получает сообщения, а клиент...

8
38 / 38 / 11
Регистрация: 21.05.2013
Сообщений: 128
10.08.2013, 12:40
у вас идет создание ServerSocket на клиенте:
ServerSocket server = new ServerSocket(chatPort);
Зачем?
Он должен создаваться сервером и только один раз.

Добавлено через 2 минуты
В целом, я вам советую идти от простого к сложному, не пытайтесь написать сразу весь код целиком, начните с простого обмена в одну сторону, потом в обе стороны, потом добавляйте клиентов. В начале код используйте как можно проще и короче. Просто так - гораздо проще понять где ошибка, так как объем кода не велик.
0
1 / 1 / 3
Регистрация: 04.06.2013
Сообщений: 48
10.08.2013, 12:54  [ТС]
Цитата Сообщение от MaxNevermind Посмотреть сообщение
В целом, я вам советую идти от простого к сложному, не пытайтесь написать сразу весь код целиком, начните с простого обмена в одну сторону, потом в обе стороны, потом добавляйте клиентов. В начале код используйте как можно проще и короче. Просто так - гораздо проще понять где ошибка, так как объем кода не велик.
Так я и начинал) Сначала сделал обмена в одну сторону, потом в обе стороны, а теперь пытаюсь добавлять клиентов. А ServerSocket в клиенте нужен для того чтобы принимать сообщения, пробовал сделать без него но испортил весь код) Я понимаю алгоритм выполнения но вот реализовать никак не получается(( Чувствую на выходные мне работа обеспечена))
0
38 / 38 / 11
Регистрация: 21.05.2013
Сообщений: 128
10.08.2013, 13:06
Вкратце:
Задача ServerSocket - слушать порт на предмет попытки подключения
Задача Socket - обмен данными
На сервере создается ServerSocket, к нему через Socket пытаются подключиться клиенты, если это происходит то он создает отдельный Socket для общения с ним.
Общение идет через стримы, которые можно получить через методы Socket: getOutputStream\getInputStream.

Итого:
На каждом клиенте один Socket и два стрима
На сервере один ServerSocket и Socket на каждого клиента и по два стрима на каждый Socket
1
1 / 1 / 3
Регистрация: 04.06.2013
Сообщений: 48
10.08.2013, 13:15  [ТС]
Классно вы мне тут все расписали) Буду делать так: создам три потока, главный для регистрации клиентов, и два для приема и отправки сообщения.
А как можно сделать копию сокета? Есть что-то на подобии конструктора копирования или метода clone?
0
38 / 38 / 11
Регистрация: 21.05.2013
Сообщений: 128
10.08.2013, 13:27
В смысле на сервере?
В вашем коде сервера строчка:
Java
1
client = server.accept();
client здесь и есть типа Socket, server.accept() - останавливает текущий Thread в котором он выполняется и слушает порт, как только к нему попытается подключиться клиент он возвращает значение типа Socket и Thread продолжает свою работу. И так как все это помещено в бесконечный цикл
Java
1
2
while(true){ 
client = server.accept();
то получается здесь они(эта куча Socket) и создается, цикл "крутиться" до бесконечности создавая новые Socket на каждого клиента который хочет подключиться
1
1 / 1 / 3
Регистрация: 04.06.2013
Сообщений: 48
10.08.2013, 15:23  [ТС]
Поидеи все должно работать, но почему-то это не так( Алгоритм такой: когда подключается клиент мы сохраняем его адрес в массиве, затем создаем для него поток для обработки сообщений. После того как клиент ввел сообщения мы создаем отдельный поток для того чтобы вывести всем клиентам это сообщение. Логика вроде правильная, а на практике ничего не работает! Почему то идет зацикливание вот этого момента:
Java
1
2
3
4
5
6
7
for(String ip : JavaApplication4.ipList){
                    sock = new Socket(ip,JavaApplication4.serverPort);
                    out = new DataOutputStream(sock.getOutputStream());
                    System.out.println(message);
                    out.writeUTF(message);
                    out.flush();
                }
Я так понимаю это не зацикливание а просто почему-то с этим методом, работает много потоков, но я создавал только один? Где я накосячив? И почему не работает вот эта команда?
Java
1
out.writeUTF(message);
После того как клиент ввел сообщение оно должны вернуться к нему а оно не возвращается..
Server
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication4;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author Admin
 */
 
 
public class JavaApplication4 {
 
    public static void main(String[] args) throws InterruptedException{
 
        Socket client = null;
        ServerSocket server;
        
        try{
            server = new ServerSocket(serverPort);
            
            while(true){
                client = server.accept();
                InetAddress ip = client.getInetAddress();
                ipList.add(ip.getHostAddress());
                (new JavaApplication4()).new inThread(client);
            }
        }catch(IOException e){
            System.out.println("Connection is lost..");
        }finally{
            if(client != null){
                try{
                    client.close();
                }catch(IOException e){
                    System.out.println("Cant close client socket!");
                }
            }
        }
        
    }
    public static int serverPort = 7777;
    public static String serverIp = "127.0.0.1";
    public static BufferedReader keyboard;
    public static ArrayList<String> ipList = new ArrayList<>();
    
    private class OutThread extends Thread{
        public OutThread(String message){
            this.message = message;
            start();
        }
        
        public void run(){
            try{
                for(String ip : JavaApplication4.ipList){
                    sock = new Socket(ip,JavaApplication4.serverPort);
                    out = new DataOutputStream(sock.getOutputStream());
                    System.out.println(message);
                    out.writeUTF(message);
                    out.flush();
                }
            }catch(IOException ex){
                    ex.printStackTrace();
                }finally{
                try {
                    out.flush();
                    out.close();
                    sock.close();
                } catch (IOException ex) {
                    Logger.getLogger(JavaApplication4.class.getName()).log(Level.SEVERE, null, ex);
                }
                }
            
        }
        
        private String message; 
        private DataOutputStream out;
        private Socket sock;
    }
    
    private class inThread extends Thread{
        private Socket sock;
        
        public inThread(Socket s){
            sock = s;
            start();
        }
        public void run(){
            try {
                DataInputStream in;
                in = new DataInputStream(sock.getInputStream());
                while(true)
                {
                    String temp = in.readUTF();
                    new OutThread(temp);
                }
            } catch (IOException ex) {
                
            }
        }
    }
}
Client
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
 
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author Admin
 */
 
class ManyPost extends Thread{
    
    private Socket client;
    static public boolean isStart = false;
    private DataOutputStream out;
    private String message = "";
    private BufferedReader keyboard;
    
    public ManyPost(Socket client, String nameThread) throws IOException{
        super(nameThread);
        this.client = client;
        out = new DataOutputStream(client.getOutputStream());
        keyboard = new BufferedReader(new InputStreamReader(System.in));
        isStart = true;
        start();
    }
    public void run(){
        while(isStart)
        {
            try {
                message = keyboard.readLine();
                if(!message.equals("")){
                    if(isStart){
                        out.writeUTF("Client: " + message);
                        out.flush();
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(ManyPost.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
 
public class Client {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args){
        Socket client = null;
    String address = "127.0.0.1";
    int port = 7777;
        InetAddress ipAddress;
        ManyPost post = null;
        DataInputStream in = null;
        try{
            ipAddress = InetAddress.getByName(address);
            client = new Socket(ipAddress,port);
        in = new DataInputStream(client.getInputStream());     
            post = new ManyPost(client,"ManyPost");
            
            String ServerMessage = "";
            while(!ServerMessage.equals("exit"))
            {
                    ServerMessage = in.readUTF();
                    System.out.println(ServerMessage); 
            }
            
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            ManyPost.isStart = false;
            if(client != null)
                try{
                    client.close();
                }catch(IOException e){
                    System.out.println("Cant close client socket!");
                }
        }
        
 
    }
}
Добавлено через 56 минут
Вот этот кусок кода почему-то генерирует эти потоки выводящие одно и тоже сообщение. А разве он не должен ждать пока не подключится кто другой?
Java
1
2
3
4
5
6
while(true){
                client = server.accept();
                InetAddress ip = client.getInetAddress();
                ipList.add(ip.getHostAddress());
                (new JavaApplication4()).new inThread(client);
            }
Объясните где я здесь накосячил, код не большой, но где тут эти баги найти..
0
38 / 38 / 11
Регистрация: 21.05.2013
Сообщений: 128
10.08.2013, 15:44
Java
1
2
for(String ip : JavaApplication4.ipList){
                    sock = new Socket(ip,JavaApplication4.serverPort);
Это ошибка.
new Socket() - конектится к серверу

Еще раз:
client = server.accept(); Вот то место где вы получаете сокет на клиента, не надо его пересоздавать. С ним и работайте, сохраняйте его или сохраняйте оба его стрима и работайте дальше с ними.
1
1 / 1 / 3
Регистрация: 04.06.2013
Сообщений: 48
10.08.2013, 16:10  [ТС]
MaxNevermind, Большое спасибо! Сам бы я долго разбирался что к чему. Уже все работает так как я хотел! Еще раз спасибо!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.08.2013, 16:10
Помогаю со студенческими работами здесь

ClientSocket & ServerSocket
подскажите как быть если у клиента и у сервера динамический ip-адресс.

ServerSocket & ClientSocket
Делал программу на основе Server/ClientSocket, сервер должен был просто отправить клиенту строку текста. Проблема в том, что когда я...

Задача по ServerSocket & ClientSocket
Всем кому не лень помочь в написании следующей проги, ответьте! У меня такая задача: имеется комп подключенный к инету и мой комп...

Как узнать? какой номер порта написать при создании Socket и ServerSocket (IP - localhost)?
Здравствуйте, впервые на Java пишу простенькое клиент-серверное приложение. Подскажите как узнать какой номер порта написать при создании...

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume WHERE ' &amp; ''' &amp;...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru