powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Работа с сокетами, I/O
14 сообщений из 14, страница 1 из 1
Работа с сокетами, I/O
    #37867528
TAXD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, помогите пожалуйста, 2 дня уже убил на поиск решения - не могу больше.

Проблема:
Есть приложение и есть сервер с которым оно обменивается данными, нужно эти данные перехватить и прочитать.

Решение:
В приложении подменить адрес сервера на 127.0.0.1, написать программу которая будет обрабатовать все запросы по нужному порту (СекетСервер), затем эта программа будет отправлять данные полученные от приложения на сервер(Якобы их отправило приложение), затем программа получит ответ от сервера и отправит его обратно приложению - И так, мы получаем некое подобие прокси сервера, с помощью которого можно читать все запросы данного приложения.

Проблема реализации:
У меня получилось реализовать приём данных от приложения и получить I/O потоки (Да да, я знаю что это легко, просто по факту написал):
ServerSocket srv1 = new ServerSocket(12345);
Socket client1 = srv1.accept();
InputStream in1 = client1.getInputStream();
OutputStream out1 = client1.getOutputStream();

И получилось получить сокеты и I/O для общения с сервером:
Socket client2 = new Socket("12.12.123.123", 12345);
OutputStream out2 = client2.getOutputStream();
InputStream in2 = client2.getInputStream();

Теперь самое главное - Как реализовать то, что я описал выше, используя эти I/O? Я уже перепробовал over9000 различных способов, методом проб и ошибок, и уже получается и обработать сокет клиента, и отправить данные на сервер, и ответ получить и перенаправить его клиенту, но что-то не так происходит и после нескольких первых переданных пакетов приложение просто зависает - я что-то криво передал/обработал.

Собственно, вопрос:
Подскажите, как нормальные кодеры а не кр*ворукие м*даки как я реализуют такую схему? Я вас умоляю, сил больше нет, два дня с этим бьюсь, надежда только на вас
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867599
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер и клиент нужно обслуживать в разных потоках (Threads). А перекачку данных можно вообще организовать через
PipedInputStream/PipedOutputStream. Вам только в логике Threads нужно разобраться.
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867631
tolen.maksut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TAXD,

Ты хочешь сделать СHAT?
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867638
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolen.maksutTAXDнекое подобие прокси сервераТы хочешь сделать СHAT?
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867641
tolen.maksut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolen.maksut,


Я тоже столковался с такими темами, У меня есть кусок кода, Я думаю что может это для тебя пригодиться,,,,,,,,,,,,,,,,,,

<b>здесь Сервер:</b>

import java.io.*;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class NetServer1{
public static void main(String args[])throws Exception{
ServerSocket ss=new ServerSocket(4444);
System.out.println("Waiting client...");
Socket t=ss.accept();//waiting accept()
//client aceept();
Scanner ix=new Scanner (t.getInputStream());
PrintWriter pw=new PrintWriter(t.getOutputStream());
while(true){
String b=ix.nextLine();
JOptionPane.showMessageDialog(null,"Maximus: "+b);
String message=JOptionPane.showInputDialog("Message");
pw.println(message);
pw.flush();
}
}
}


<b>а здесь Клиент:</b>


import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
import java.util.Scanner;
import java.net.ServerSocket;
public class Client1{
public static void main(String[] args) throws Exception {
Socket s =new Socket("localhost",4444);
OutputStream os=s.getOutputStream();
PrintWriter pw=new PrintWriter(os);
Scanner ix=new Scanner(s.getInputStream());
while (true){
String message = JOptionPane.showInputDialog("Message");
pw.println(message);
pw.flush();
String c=ix.nextLine();
JOptionPane.showMessageDialog(null, "MaxweLL: "+c);
}
}
}
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867642
TAXD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, В логике потоков я разбираюсь, а вот про PipedInputStream/PipedOutputStream ещё не слышал, огромное спасибо, пойду пробовать!

tolen.maksut, Если бы я делал чат, то мне не пришлось бы перехватывать свои собственные запросы с помощью второй программы :)
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867646
TAXD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tolen.maksut,
Спасибо за код, сейчас попробую разобраться в нём. Обязательно отпишусь позже + выложу исходный код, может быть кому-то в будущем пригодится
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867657
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TAXDВ логике потоков я разбираюсь
Тогда вместо "приложение просто зависает" вы бы озвучили проблему более конкретно. Ведь не "приложение зависает", а поток блокируется на IO операции. Например когда вы пытаетесь считать данные из сервера, поток останавливается в ожидании данных. Поэтому он никак не может обслужить клиента, который в это же время пытается отправить запрос на прокси. Чтобы его обслужить нужен другой поток.
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867685
tolen.maksut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,


да да я понял, вы хотите сделать процесс параллельно да????
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867700
TAXD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, Вы правы, но я имел ввиду что зависает приложение-клиент а не программа, в программе как-раз таки всё работает в отдельном потоке, просто я не знал как реализовать именно "мост" между этими сокетами, но вы помогли, огромное спасибо ещё раз :)
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867829
TAXD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, Ещё вопрос..
Сделал 2 потока, один для отправки байтов серверу от клиента, другой для отправки байтов клиенту от сервера, пока что реализовал вот таким способом(Временно, для теста):
int tmpb = 0;
while (true) {
if ((tmpb = Home.in1.read()) != -1) {
System.out.println("Отправка байтов клиента -> серверу");
Home.pout1.write(tmpb);
}
}

Где tmpb - временный байт, Home.in1- поток от клиента, Home.pout1 - поток типа PipedOutputStream который записывает данные в out поток клиента:
Home.pout2 = new PipedOutputStream();
Home.pin2 = new PipedInputStream(Home.pout2);

Вопрос - Правильно ли я понял суть работы PipedOutputStream и PipedInputStream, или всё таки делаю что-то не правильно?
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867864
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторTypically, data is read from a PipedInputStream object by one thread and data is written to the corresponding PipedOutputStream by some other thread. Attempting to use both objects from a single thread is not recommended, as it may deadlock the thread.

Похоже на ваш случай.
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867866
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TAXD,

Не знаю. Возможно и PipedStream особого смысла нет использовать. Ему ведь всё равно нужен кто-то один кто будет потреблять или отправлять данные. В прокси таковых нет. С тем же успехом можно два потока запустить перекачивающих. Один в одну сторону, другой в другую.
...
Рейтинг: 0 / 0
Работа с сокетами, I/O
    #37867973
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TAXD
Код: java
1.
2.
3.
4.
5.
6.
7.
int tmpb = 0;
while (true) {
				if ((tmpb = Home.in1.read()) != -1) {
					System.out.println("Отправка байтов клиента -> серверу");
					Home.pout1.write(tmpb);
				}
}


цикл хорошо бы соптимизировать через буфер и метод available().
Чтение по одному байту может дать лишнюю нагрузку на CPU.
Buffered*Stream не очень-то подходит. В нем будут оседать данные, если пакет закончится на середине буфера. Поток заблокируется на IO и некому будет передать данные осевшие в буфере.
Поэтому стоит использовать available() и собственный byte[] буфер, чтобы данные читать пачками, а не по одному байту. А метод available() нужен чтобы не заблокировать поток раньше времени. Т.е. перед тем как уснуть, все доступные данные прокачать.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Работа с сокетами, I/O
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]