Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
5 / 4 / 1
Регистрация: 15.12.2015
Сообщений: 255

Опять сокеты и передача строк

13.02.2018, 20:30. Показов 6772. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Помогите разобраться в плане передачи текста с помощью сокетов.
Соорудил простейшие сервер и клиент и кидаю строку от клиента к серверу.

Сервер:

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
public class Server {
 
    public static void main(String[] args) {
 
        try {
            ServerSocket server = new ServerSocket(9999);
            Socket connection = server.accept();
 
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
 
            String text;
 
            while ((text = in.readLine()) != null) {
 
                System.out.println(text);
 
            }
 
            connection.close();
 
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
}
Клиент:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Client {
 
    public static void main(String[] args) {
 
        Socket socket = new Socket();
        try {
            socket.connect(new InetSocketAddress("127.0.0.1", 9999), 5);
            DataOutputStream os = new DataOutputStream(socket.getOutputStream());
            os.writeBytes("123");
            os.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
}
Пытаюсь передать строку 3мя способами:
1. os.writeBytes("123");
2. os.writeUTF("123");
3. os.writeChars("123");

В итоге сервер принимает:
1. Как отправили, так и приняли: "123"
2. Принимаем строку, но перед ней какие-то левые символы: " 123"
3. Принимаем строку, но перед каждым символом пробел: " 1 2 3"

Собсно вопрос: почему во втором и третьем случае строка модифицируется и как собственно говоря правильно надо передавать строку ?
Заранее благодарен за внимание!))
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2018, 20:30
Ответы с готовыми решениями:

хоть убейте а опять сокеты
ришу прогу раз десятый (раньше всё работало но вот раслабил мозг на пару дней) тут при подключении exploera или fireFox по любому ip...

Сокеты: передача файлов. С
Не могли бы вы показать какие-нибудь исходники на эту тему... я в ней новичок и вообще ни в зуб ногой) пробовал на шарпе, но знакомые...

Сокеты: передача данных
И так есть сервер, и в нем прослушка для приема файлов: Socket sListener; Socket fileHandler; .... ...

9
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
13.02.2018, 21:01
Цитата Сообщение от bobo96 Посмотреть сообщение
почему во втором и третьем случае строка модифицируется?
Потому что кодировка символов на клиенте в этих трёх методах и сервере отличаются.
В третьем варианте клиент передаёт char'ы как есть в их Java'вском представлении, в виде двух байт UTF-16, сервер же читает с дефолтной кодировкой операционной системы, которая, в случае Windows — однобайтная CP-1251.
Во втором варианте не очень понятно, но, видимо, клиент передаёт в UTF-8 с BOM (byte-order-mark), который и идёт в начале. По-хорошему, поток UTF-8 байт не должен содержать BOM, т.к. BOM для UTF-8 не имеет смысла и это плохая практика.

Цитата Сообщение от bobo96 Посмотреть сообщение
как собственно говоря правильно надо передавать строку?
В той же кодировке, в которой её ожидает сервер. Я бы рекомендовал использовать UTF-8, только вместо
Java
1
os.writeUTF("123")
на клиенте использовать
Java
1
os.writeBytes("123".getBytes(StandardCharsets.UTF_8))
1
85 / 67 / 25
Регистрация: 09.10.2017
Сообщений: 208
13.02.2018, 21:07
на stackoverflow про writeUTF
цитата:
"Записывает два байта информации о длине в выходной поток, за которым следует модифицированное представление UTF-8 каждого символа в строке s."
1
5 / 4 / 1
Регистрация: 15.12.2015
Сообщений: 255
13.02.2018, 21:09  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
os.writeBytes("123".getBytes(StandardCha rsets.UTF_8))
Спасибо.
Только наверно не writeBytes, а просто write ? Ибо на writeBytes в таком представлении ide ругаецца)
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
13.02.2018, 21:53
Лучший ответ Сообщение было отмечено bobo96 как решение

Решение

И зачем ты на клиенте оборачиваешь output stream в DataOutputStream, при том, что на сервере не используешь DataInputStream?

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
 
final class Server {
 
    public static void main(String[] args) {
        try {
            final ServerSocket server = new ServerSocket(9999);
            try (
                    Socket connection = server.accept();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(
                            connection.getInputStream(),
                            StandardCharsets.UTF_8
                    ))) {
                String text;
                while ((text = reader.readLine()) != null) {
                    System.out.println(text);
                    if (text.equals("exit")) {
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
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
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
 
final class Client {
 
    public static void main(String[] args) {
        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress("127.0.0.1", 9999), 5);
            try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream(),
                    StandardCharsets.UTF_8
            ))) {
                writer.write("123\n");
                writer.write("Привет, Мир!\n");
                writer.write("Parlez-vous français?\n");
                writer.write("exit");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Добавлено через 45 секунд
Цитата Сообщение от TinSemenova Посмотреть сообщение
на stackoverflow про writeUTF
цитата:
"Записывает два байта информации о длине в выходной поток, за которым следует модифицированное представление UTF-8 каждого символа в строке s."
Да, я только потом обратил внимание, что он DataOutputStream использует.

Добавлено через 43 секунды
Цитата Сообщение от bobo96 Посмотреть сообщение
Только наверно не writeBytes, а просто write ? Ибо на writeBytes в таком представлении ide ругаецца)
Не знаю. Ты сам в исходном примере написал writeBytes
0
5 / 4 / 1
Регистрация: 15.12.2015
Сообщений: 255
13.02.2018, 22:04  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
И зачем ты на клиенте оборачиваешь output stream в DataOutputStream, при том, что на сервере не используешь DataInputStream?
Вообще задумка такая, что бы сервером ловить вообще любую строку вне зависимости от того, каким способом она была отправлена.
Такое возможно в принципе ?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
13.02.2018, 22:37
Цитата Сообщение от bobo96 Посмотреть сообщение
Такое возможно в принципе?
Естественно, в чём проблема? Читай строки в UTF-8, я ж показал.
1
1 / 1 / 0
Регистрация: 10.04.2016
Сообщений: 7
14.03.2018, 13:46
Здравствуйте. Нужна помощь в реализации передачи файлов от клиентов серверу. Реализация на netty 4.1. Получилось реализовать чат, как его переделать для передачи файлов любого объема?

Север:
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
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
/**
 *
 * @author nomid
 */
public class Server {
    public String HOST;
    public  int PORT;
    ServerHandler srvHand = new ServerHandler();
    
    public Server(String host, int port) {
        this.HOST = host;
        this.PORT = port;
    }
    
    public void run() throws InterruptedException, IOException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap bootstrap = new ServerBootstrap()
                    .group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline().addLast(
                                    new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()),
                                    new StringDecoder(),
                                    new StringEncoder(),
                                    new ServerHandler()
                            );
                        }
            });
            
            bootstrap.bind(HOST, PORT).sync().channel();
            
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                srvHand.send(in.readLine());
            }
            
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) throws InterruptedException, IOException {
        new Server("127.0.0.1", 10101).run();
    }
}

Буду благодарен за любые идеи...
Вложения
Тип файла: txt Client.txt (4.9 Кб, 5 просмотров)
Тип файла: txt ClientHandler.txt (906 байт, 1 просмотров)
Тип файла: txt Server.txt (2.6 Кб, 1 просмотров)
Тип файла: txt ServerHandler.txt (2.3 Кб, 0 просмотров)
0
1 / 1 / 0
Регистрация: 10.04.2016
Сообщений: 7
14.03.2018, 13:57
В дополнение коды остальных файлов

Обработчик на сервере (ServerHandler)
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
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.DefaultEventExecutor;
/**
 *
 * @author nomid
 */
public class ServerHandler extends SimpleChannelInboundHandler<String>{
    private static final ChannelGroup CHANNELS = new DefaultChannelGroup(new DefaultEventExecutor());
    
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        Channel incoming = ctx.channel();
        incoming.writeAndFlush("[SERVER] - Wilcom to chat!\r\n");
        
        for (Channel channel : CHANNELS) {
            channel.writeAndFlush("[" + incoming.remoteAddress() + "] has joined!\r\n");
        }
        CHANNELS.add(incoming);
    }
 
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        Channel removed = ctx.channel();
        
        for (Channel channel : CHANNELS) {
            channel.write("[" + removed.remoteAddress() + "] has remover chat!\r\n");
            channel.flush();
            channel.writeAndFlush(ctx);
        }
        CHANNELS.remove(removed);
    }
    
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        Channel talk = ctx.channel();
        System.out.println("[" + talk.remoteAddress() + "] " + msg);
    }
 
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        Channel talk = ctx.channel();
        System.out.println("[" + talk.remoteAddress() + "] " + msg.toString());
    }
 
    public void channelRead(ChannelHandlerContext ctx, int msg) throws Exception {
        Channel talk = ctx.channel();
        if ((int) msg != -1) {
            System.out.println("[" + talk.remoteAddress() + "] " + msg);
        }
    }
    
    public void send(String msg) {
        for (Channel channel : CHANNELS) {
            channel.writeAndFlush("[SERVER] " + msg + "\r\n");
        }
    }
}
Клиент
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
108
109
110
111
112
113
114
115
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.stream.ChunkedNioFile;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.file.Files;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
 
/**
 *
 * @author nomid
 */
public class Client {
    public String HOST;
    public int PORT;
 
    public Client(String host, int port) {
        this.HOST = host;
        this.PORT = port;
    }
    
    public void run() throws InterruptedException, IOException {
        EventLoopGroup group = new NioEventLoopGroup();
        
        try {
            Bootstrap bootstrap = new Bootstrap()
                    .group(group)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>() {
                                    
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline().addLast(
                                    new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()),
                                    new StringDecoder(),
                                    new StringEncoder(),
                                    new ClientHandler());
                        }
                    });
            
            Channel channel = bootstrap.connect(HOST, PORT).sync().channel();
            
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                if (!"file".equals(in.readLine())) {
                    channel.writeAndFlush(in.readLine() + "\r\n");
                } else {
                    JFileChooser chooser = new JFileChooser();
                    int send = chooser.showDialog(null, "Send");
                    if (send == JFileChooser.APPROVE_OPTION) {
                        try {
                            File source = new File(chooser.getSelectedFile().getPath());
                            FileInputStream fileIS = new FileInputStream(source);
                            InputStreamReader inputSR = new InputStreamReader(fileIS, "windows-1251");
                            
                            
                            String str = source.getName();
                            String[] newfilename = str.split(".txt");
 
                            File dest = new File(source.getParent() + "\\" + newfilename[0] + " copy.txt");
                            FileOutputStream fileOS = new FileOutputStream(dest);
                            OutputStreamWriter outSW = new OutputStreamWriter(fileOS, "windows-1251");
                            
                            int c;
                            while ((c = inputSR.read()) != -1) {
                                int integer = c;
                                System.out.print((char) integer);
                                System.out.print(": " + integer);
                                System.out.println("");
                                outSW.append((char) integer);
                                channel.writeAndFlush(integer);
                            }
                            
                            inputSR.close();
                            outSW.close();
                            
                        } catch (Exception ex) {
                            System.out.println(ex.getMessage());
                        }
                        
                        channel.write(chooser.getSelectedFile().getPath());
                        channel.flush();
                    }
                }
            }
        } finally {
            group.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) throws InterruptedException, IOException {
        new Client("127.0.0.1", 10101).run();
    }
}

Обработчик на клиенте (ClientHandler)
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
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
 
/**
 *
 * @author nomid
 */
public class ClientHandler extends SimpleChannelInboundHandler<String>{
 
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        System.out.println(msg);
    }
    
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object file) throws Exception {
        System.out.println(file.toString());
    }
 
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
0
1 / 1 / 0
Регистрация: 10.04.2016
Сообщений: 7
16.03.2018, 16:45
Вопрос решен. Привожу код для тех кто столкнулся с подобной проблемой

Если на ваш счет код корявый сильно не ругать

Сервер:
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
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
/**
 *
 * @author nomid
 */
public class Server {
    public String HOST;
    public  int PORT;
    ServerHandler SRVHAND = new ServerHandler();
    
    public Server(String host, int port) {
        this.HOST = host;
        this.PORT = port;
    }
    
    public void run() throws InterruptedException, IOException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap bootstrap = new ServerBootstrap()
                    .group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline().addLast(
                                    new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()),
                                    new StringDecoder(),
                                    new StringEncoder(),
                                    new ServerHandler()
                            );
                        }
            });
            
            bootstrap.bind(HOST, PORT).sync().channel();
            
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                SRVHAND.send(in.readLine());
            }
            
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) throws InterruptedException, IOException {
        new Server("127.0.0.1", 10101).run();
    }
}
Обработчик на сервере:
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.DefaultEventExecutor;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
/**
 *
 * @author nomid
 */
public class ServerHandler extends SimpleChannelInboundHandler<String>{
    private static final ChannelGroup CHANNELS = new DefaultChannelGroup(new DefaultEventExecutor());
    
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        Channel incoming = ctx.channel();
        incoming.writeAndFlush("[SERVER] - Wilcom to chat!\r\n");
        
        for (Channel channel : CHANNELS) {
            channel.writeAndFlush("[" + incoming.remoteAddress() + "] has joined!\r\n");
        }
        CHANNELS.add(incoming);
    }
 
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        Channel removed = ctx.channel();
        
        for (Channel channel : CHANNELS) {
            channel.write("[" + removed.remoteAddress() + "] has remover chat!\r\n");
            channel.flush();
            channel.writeAndFlush(ctx);
        }
        CHANNELS.remove(removed);
    }
    
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        Channel talk = ctx.channel();
        System.out.println("channelRead0 [" + talk.remoteAddress() + "] " + msg);
        
        for (Channel channel : CHANNELS) {
            if (channel.remoteAddress() != talk.remoteAddress()){
                channel.writeAndFlush("[" + talk.remoteAddress() + "] " + msg + "\r\n");
            } else {
                channel.writeAndFlush("[yuo] " + msg + "\r\n");
            }
        }
    }
 
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        Channel talk = ctx.channel();
        
        String str_msg = msg.toString();
        System.out.println(str_msg);
        String sd = "";
        if ((str_msg.charAt(0) == '[') && (str_msg.charAt(str_msg.length() - 1) == ']')) {
            
            //Определение имени файла для записи
            String[] strname = talk.remoteAddress().toString()
                    .replace('/', ' ').replace(':', ' ')
                    .trim().split(" ");
            String nameFile = "C:\\Users\\nomid\\Desktop\\Transfer\\out_file\\" 
                    + strname[0] + " copy.txt";
            
            //Подготовка данных для записи в файл
            String[] str = msg.toString().replace("[", " ").replace("]", " ").trim().split(", ");
            System.out.println("channelRead [" + talk.remoteAddress() + "] ");
            System.out.println(nameFile);
            
            File dest;
            FileOutputStream fileOS;
            FileWriter fw;
 
//            OutputStreamWriter outSW = new OutputStreamWriter(fileOS, "windows-1251");
 
            //Создание файла, если он не существует
            if (!new File(nameFile).exists()){
                System.out.println(new File(nameFile).exists());
                dest = new File(nameFile);
                fileOS = new FileOutputStream(dest);
            }
            
            //Запись в файл
            for (int i = 0; i < str.length; i++) {
                //Перевод числового значения символа в символ
                char c = (char) Integer.parseInt(String.valueOf(Integer.parseInt(str[i])));
                System.out.print(c);
                sd += c;
//                outSW.append(c);
                
            }
            Files.write(Paths.get(nameFile), sd.getBytes(), StandardOpenOption.APPEND);
//            outSW.close();
            System.out.println("");
            talk(ctx, sd);
        } else {
            System.out.println("channelRead [" + talk.remoteAddress() + "] " + msg);
            talk(ctx, msg);
        }
    }
    
    public void talk(ChannelHandlerContext ctx, Object msg) {
        Channel talk = ctx.channel();
        for (Channel channel : CHANNELS) {
            if (channel.remoteAddress() != talk.remoteAddress()){
                channel.writeAndFlush("[" + talk.remoteAddress() + "] " + msg + "\r\n");
            } else {
                channel.writeAndFlush("[yuo] " + msg + "\r\n");
            }
        }
    }
    
    public void send(String msg) {
        for (Channel channel : CHANNELS) {
            channel.writeAndFlush("[SERVER] " + msg + "\r\n");
        }
    }
}
Клиент:
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFileChooser;
 
/**
 *
 * @author nomid
 */
public class Client {
    public String HOST;
    public int PORT;
    Channel CHANNEL;
 
    public Client(String host, int port) {
        this.HOST = host;
        this.PORT = port;
    }
    
    public void run() throws InterruptedException, IOException {
        EventLoopGroup group = new NioEventLoopGroup();
        
        try {
            Bootstrap bootstrap = new Bootstrap()
                    .group(group)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>() {
                                    
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline().addLast(
                                    new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()),
                                    new StringDecoder(),
                                    new StringEncoder(),
                                    new ClientHandler());
                        }
                    });
            
            CHANNEL = bootstrap.connect(HOST, PORT).sync().channel();
            
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                String str = in.readLine();
                
                if (!"file".equals(str)) {
                    CHANNEL.writeAndFlush(str + "\n");
                } else {
                    JFileChooser chooser = new JFileChooser();
                    chooser.setCurrentDirectory(new File("C:\\Users\\nomid\\Desktop\\Transfer\\out_file"));
                    int send = chooser.showDialog(null, "Send");
                    if (send == JFileChooser.APPROVE_OPTION) {
                        sendFile(this.CHANNEL, chooser.getSelectedFile().getPath());
                        CHANNEL.writeAndFlush(chooser.getSelectedFile().getPath() + "\n");
                    }
                }
            }
        } finally {
            group.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) throws InterruptedException, IOException {
        new Client("127.0.0.1", 10101).run();
    }
    
    private void sendFile(Channel channel, String path) {
        try {
            //Чтение файла
            File source = new File(path);
            FileInputStream fileIS = new FileInputStream(source);
            InputStreamReader inputSR = new InputStreamReader(fileIS, "windows-1251");
            
            String namestr = source.getName();
            String[] newfilename = namestr.split(".txt");
            
            //Запись в файл
            File dest = new File(source.getParent() + "\\" + newfilename[0] + " copy.txt");
            FileOutputStream fileOS = new FileOutputStream(dest);
            OutputStreamWriter outSW = new OutputStreamWriter(fileOS, "windows-1251");
            
            System.out.println(source.length() + " байт");
            int c;
            List<Integer> out = new ArrayList();
            
            //Передача файла
            while ((c = inputSR.read()) != -1) {
                int integer= c;
                outSW.append((char) integer);
                if (c != 10) {
                    out.add(c);
                } else {
                    out.add(c);
                    channel.writeAndFlush(out + "\n");
                    out.clear();
                }
            }
            
            out.clear();
            
            inputSR.close();
            outSW.close();
        
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}
Обработчик на клиенте:
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
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
 
/**
 *
 * @author nomid
 */
public class ClientHandler extends SimpleChannelInboundHandler<String>{
 
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        System.out.println(msg);
    }
 
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println(msg);
    }
 
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2018, 16:45
Помогаю со студенческими работами здесь

передача сообщений через сокеты
привет всем , нужна такая помощь - имеется 2 бука ,связанных по wi-fi. необходимо организовать передачу букв или цифр между ними по сокетам...

Передача файлов через сокеты
Всем привет. Нужно передать файлы с клиента на сервер передача в клиенте такая: public void loadFile(ActionEvent actionEvent) {...

Передача Image через Сокеты
Здравствуйте коллеги. Вобщем проблема состоит в том, чтобы картинка с PictureBox на сервере передавалась в PictureBox в клиенте. Прерыл...

Передача переменных через Сокеты!
Знаю, вопрос много раз задавали и я вроде задавал тоже, но все же, дельного ответа так и не получил! Знаю есть функция SendBuff но как...

Передача видео через сокеты
Подскажите пожалуйста, как передать видео через сокеты. Сейчас имеется код: ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru