
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
05.07.2012, 13:38:19
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
Доброго времени суток, помогите пожалуйста, 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 различных способов, методом проб и ошибок, и уже получается и обработать сокет клиента, и отправить данные на сервер, и ответ получить и перенаправить его клиенту, но что-то не так происходит и после нескольких первых переданных пакетов приложение просто зависает - я что-то криво передал/обработал. Собственно, вопрос: Подскажите, как нормальные кодеры а не кр*ворукие м*даки как я реализуют такую схему? Я вас умоляю, сил больше нет, два дня с этим бьюсь, надежда только на вас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:09:28
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
Сервер и клиент нужно обслуживать в разных потоках (Threads). А перекачку данных можно вообще организовать через PipedInputStream/PipedOutputStream. Вам только в логике Threads нужно разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:24:05
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
TAXD, Ты хочешь сделать СHAT? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:27:34
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
tolen.maksutTAXDнекое подобие прокси сервераТы хочешь сделать СHAT? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:29:21
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
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); } } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:29:28
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
Blazkowicz, В логике потоков я разбираюсь, а вот про PipedInputStream/PipedOutputStream ещё не слышал, огромное спасибо, пойду пробовать! tolen.maksut, Если бы я делал чат, то мне не пришлось бы перехватывать свои собственные запросы с помощью второй программы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:31:30
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
tolen.maksut, Спасибо за код, сейчас попробую разобраться в нём. Обязательно отпишусь позже + выложу исходный код, может быть кому-то в будущем пригодится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:37:38
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
TAXDВ логике потоков я разбираюсь Тогда вместо "приложение просто зависает" вы бы озвучили проблему более конкретно. Ведь не "приложение зависает", а поток блокируется на IO операции. Например когда вы пытаетесь считать данные из сервера, поток останавливается в ожидании данных. Поэтому он никак не может обслужить клиента, который в это же время пытается отправить запрос на прокси. Чтобы его обслужить нужен другой поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:51:53
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
Blazkowicz, да да я понял, вы хотите сделать процесс параллельно да???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 14:55:35
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
Blazkowicz, Вы правы, но я имел ввиду что зависает приложение-клиент а не программа, в программе как-раз таки всё работает в отдельном потоке, просто я не знал как реализовать именно "мост" между этими сокетами, но вы помогли, огромное спасибо ещё раз :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 15:41:37
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
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, или всё таки делаю что-то не правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 15:52:25
|
|||
|---|---|---|---|
Работа с сокетами, I/O |
|||
|
#18+
автор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. Похоже на ваш случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 15:54:11
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
TAXD, Не знаю. Возможно и PipedStream особого смысла нет использовать. Ему ведь всё равно нужен кто-то один кто будет потреблять или отправлять данные. В прокси таковых нет. С тем же успехом можно два потока запустить перекачивающих. Один в одну сторону, другой в другую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2012, 16:35:17
|
|||
|---|---|---|---|
|
|||
Работа с сокетами, I/O |
|||
|
#18+
TAXD Код: java 1. 2. 3. 4. 5. 6. 7. цикл хорошо бы соптимизировать через буфер и метод available(). Чтение по одному байту может дать лишнюю нагрузку на CPU. Buffered*Stream не очень-то подходит. В нем будут оседать данные, если пакет закончится на середине буфера. Поток заблокируется на IO и некому будет передать данные осевшие в буфере. Поэтому стоит использовать available() и собственный byte[] буфер, чтобы данные читать пачками, а не по одному байту. А метод available() нужен чтобы не заблокировать поток раньше времени. Т.е. перед тем как уснуть, все доступные данные прокачать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&mobile=1&tid=2131410]: |
0ms |
get settings: |
10ms |
get forum list: |
27ms |
check forum access: |
9ms |
check topic access: |
9ms |
track hit: |
69ms |
get topic data: |
26ms |
get forum data: |
7ms |
get page messages: |
106ms |
get tp. blocked users: |
3ms |
| others: | 296ms |
| total: | 562ms |

| 0 / 0 |
