Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 18

Добавить возможность отправки фото в сетевой чат

07.04.2020, 10:18. Показов 829. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очень нужна помощь.
Есть готовый сетевой чат, нужно реализовать возможность загрузки фото в диалог.

клиентская часть
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
package chat.client;
 
import network.TCPConnection;
import network.TCPConnectionListener;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
 
public class ClientWindow extends JFrame implements ActionListener, TCPConnectionListener
{
    private static final String IP_ADDR = "192.168.0.11";
    private static final int PORT = 8189;//6942    8189
    private static final int WIDTH = 600;
    private static final int HEIGHT = 400;
 
 
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ClientWindow();
            }
        });
    }
 
    private final JTextArea log = new JTextArea();
    private final JTextField fieldNickname = new JTextField("vika");
    private final JTextField fieldInput = new JTextField();
    private final JButton button = new JButton();
 
    private TCPConnection connection;
 
    private ClientWindow()
    {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setLocationRelativeTo(null);
        setAlwaysOnTop(true);
 
        log.setEditable(false);
        log.setLineWrap(true);
        add(log, BorderLayout.CENTER);
 
        fieldInput.addActionListener(this);
        button.addActionListener(this);
        add(fieldInput, BorderLayout.SOUTH);
        add(fieldNickname, BorderLayout.NORTH);
        add(button, BorderLayout.WEST);
 
        setVisible(true);
        try {
            connection = new TCPConnection(this, IP_ADDR, PORT);
        } catch (IOException e) {
            printMsg("Connection exception: " + e);
        }
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        String msg = fieldInput.getText();
        if(msg.equals(""))return;
        fieldInput.setText(null);
        connection.sendString(fieldNickname.getText() + ": " + msg);
    }
 
 
    @Override
    public void onConnectionReady(TCPConnection tcpConnection) {
        printMsg("Connection ready...");
    }
 
    @Override
    public void onReceiveString(TCPConnection tcpConnection, String value) {
        printMsg(value);
    }
 
    @Override
    public void onDisconnect(TCPConnection tcpConnection) {
        printMsg("Connection close");
    }
 
    @Override
    public void onException(TCPConnection tcpConnection, Exception e) {
        printMsg("Connection exception: " + e);
    }
 
    private synchronized void printMsg(String msg)
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                log.append(msg + "\n");
                log.setCaretPosition(log.getDocument().getLength());
            }
        });
    }
}

серверная часть
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
package chat.server;
 
import network.TCPConnection;
import network.TCPConnectionListener;
 
import java.io.IOException;
import java.net.ServerSocket;
import java.util.ArrayList;
 
public class ChatServer implements TCPConnectionListener
{
    public static void main(String[] args)
    {
        new ChatServer();
    }
 
    private final ArrayList<TCPConnection> connections = new ArrayList<>();//список TCP соединений
 
    private ChatServer() throws RuntimeException {
        System.out.println("Server running...");
        try(ServerSocket serverSocket = new ServerSocket(8189))//создаем сервер socket, который слушает TCP порт 8189
        {
            while (true)
            {
                try {
                    new TCPConnection(this, serverSocket.accept());//получаем объект socket и передаем в конструктор TCPConnection, включая себя, как listener
                }catch (IOException e)
                {
                    System.out.println("TCPConnection exception: " + e);
                }
            }
        }catch (IOException e)
        {
            throw  new RuntimeException(e);
        }
    }
 
    //методы синхронизированны, чтобы одноверемеено из разных потоков нельзя было в них попасть
    @Override
    public synchronized void onConnectionReady(TCPConnection tcpConnection) {
        connections.add(tcpConnection);//подключился новый клиент
        sentToAllConnections("Client connected: " + tcpConnection);
    }
 
    @Override
    public synchronized void onReceiveString(TCPConnection tcpConnection, String value) {
        sentToAllConnections(value);
    }
 
    @Override
    public synchronized void onDisconnect(TCPConnection tcpConnection) {
        connections.remove(tcpConnection);
        sentToAllConnections("Client disconnected: " + tcpConnection);
    }
 
    @Override
    public synchronized void onException(TCPConnection tcpConnection, Exception e) {
        System.out.println("TCPConnection exception: " + e);
    }
 
    private void sentToAllConnections(String value)
    {
        System.out.println(value);
        final int cnt = connections.size();
        for(int i = 0; i < cnt; i++)
        {
            connections.get(i).sendString(value);
        }
    }
}
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
package network;
 
import java.io.*;
import java.net.Socket;
import java.nio.charset.Charset;
 
public class TCPConnection
{
    private final Socket socket;
    private final Thread rxThread;//поток, который слушает входящие сообщения, постоянно читает поток ввода
    private final TCPConnectionListener eventListener;//слушатель событий
    private final BufferedReader in;//поток ввода
    private final BufferedWriter out;//поток вывода
 
    public TCPConnection(TCPConnectionListener eventListener, String ipAddr, int port) throws IOException //создает новый socket
    {
        this(eventListener, new Socket(ipAddr, port));//вызываем второй конструктор на основе нового socket, которому передаем ipAddr, port
 
    }
 
    public TCPConnection(TCPConnectionListener eventListener, Socket socket) throws IOException//конструктор на случай, если кто-то снаружи создаст соединение(socket)
    {
        this.eventListener = eventListener;
        this.socket = socket;
        in = new BufferedReader( new InputStreamReader(socket.getInputStream(), Charset.forName("UTF-8")));//получаем входящий поток
        out = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), Charset.forName("UTF-8")));//получаем выходящий поток
        rxThread = new Thread(new Runnable() {//создание анонимного класса
            @Override
            public void run() {
                try {
                    eventListener.onConnectionReady(TCPConnection.this);
                    while (!rxThread.isInterrupted())//пока поток не прерван
                    {
                        eventListener.onReceiveString(TCPConnection.this, in.readLine());//считываем строчку, передаем методу интерфейса объект соединения и строчку
                    }
 
                }catch (IOException e) {
                    eventListener.onException(TCPConnection.this, e);
                }finally {
                    eventListener.onDisconnect(TCPConnection.this);//если по какой-либо причине закончился блок try
                }
 
            }
        }); //поток, который слушает всё входящее
        rxThread.start();
    }
 
    //синхронизированные методы, к которым можно обратиться из любого потока
    public synchronized void sendString(String value)//отправить сообщение
    {
        try {
            out.write(value + "\r\n");
            out.flush();//принудительная передача строки(сбрасывает все буферы)
        } catch (IOException e) { //если не получилось передать сообщение, генерируем ошибку, вызываем метод, обрывающий соединение
            eventListener.onException(TCPConnection.this, e);
            disconnect();
        }
    }
 
    public synchronized void disconnect()//метод, который обрывает соединение
    {
        rxThread.interrupt();
        try {
            socket.close();
        } catch (IOException e) {
            eventListener.onException(TCPConnection.this, e);
        }
    }
 
    @Override
    public String toString()
    {
        return "TCPConnection: " + socket.getInetAddress() + ": " + socket.getPort();
    }
 
}

Java
1
2
3
4
5
6
7
8
9
package network;
 
public interface TCPConnectionListener
{
    void  onConnectionReady(TCPConnection tcpConnection);//готовое соединение, с которым можно работать
    void  onReceiveString(TCPConnection tcpConnection, String value);//принятие строки
    void  onDisconnect(TCPConnection tcpConnection);//разъединение
    void  onException(TCPConnection tcpConnection, Exception e);//возникло исключение
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2020, 10:18
Ответы с готовыми решениями:

В исходник добавить возможность отправки аудиофайла в канал
Здравствуйте. Возможно ли добавить функцию, что бы при нажатие кнопки, происходила не маскировка голоса, а воспроизведение файла, например...

Отправка данных на сервер: добавить в код возможность повторной отправки
В общем есть такой код: //подключение TcpClient clientSocket = new TcpClient(); while...

Как добавить ВК фото в блок с фото на стене (там где 4 фотки)
Собственно сюда:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2020, 10:18
Помогаю со студенческими работами здесь

Сетевой чат
каким образом на delphi можно сделать чат для возможности пользоваться через через интернет, например в разных странах даже, локальный чат...

Сетевой чат
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,wininet,...

Сетевой чат
procedure TForm1.FormCreate(Sender: TObject); begin name:=InputBox('ââåäèòå èìÿ ïîëüçîâàòåëÿ','Ëîãèí','Èìÿ ïîëüçîâàòåëÿ íà...

Сетевой чат UDP
Пишу чат UDP, в процессе возникла ошибка, с которой не могу справиться. int main() { int sock; struct sockaddr_in...

Сетевой чат с приватными сообщениями
Здравствуйте дорогие друзья. Есть вот такой чат, который состоит из сервера и клиента (естественно клиентов может быть много). Сделано все...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru