Всем доброго времени суток, вот уже два дня никак немогу решить проблему с подключением к некоторым web-серверам например youtube.com, sibir.megafon.ru, microsoft.ru пока это список не расширялся.
Я написал программу тоннелирования, что-то вроде прокси. Получив от браузера заголовок я из него вычитываю Host: и подключаюсь с помощью сокета и отправляю полученный заголовок, и жду ответа, все сайты нормально выдают ответы, кроме выше перечисленных, на них Socket реагирует не иначе как java.net.SocketException: Connection reset to peer SocketInputStreamRead(Native methode), я бы подумал что сайты не работают, но при подключнии к ним через другой прокси все работает отлаженно.
Код | package ru.nsk.struchkov.ServerSide;
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.InetAddress;
/* * @Author Struchkov L.F * @Classname - ReadWriteThread : connect to HTTP server and data response to remote client * @Version - 0.0.1 * @Date 12.06.09 */
public class ReadWriteThread extends Thread{
private Socket clientSocket = null; private Socket httpServerSocket = null; private ReadWriteThread coupleThread = null;
private byte[] buffer = new byte[BUFFER_SIZE]; public static int qThread = 0;
public ReadWriteThread(Socket clientSocket)throws IOException{ this.clientSocket = clientSocket; }
// configuration
public Socket getClientSocket() { return clientSocket; }
// configuration public Socket getHttpServerSocket() { return httpServerSocket; } // implementation public void run() { qThread++; System.out.println("Thread count _____ " + qThread); try {
DataInputStream inputClientStream = new DataInputStream(clientSocket.getInputStream()); DataOutputStream outputClientStream = new DataOutputStream(clientSocket.getOutputStream()); byte[] buffer = new byte[BUFFER_SIZE]; int count = 0; String header = "";
// Read HTTP header from remote client while((count = inputClientStream.read(buffer)) == BUFFER_SIZE) { header += new String(buffer); }
byte[] tmpBuffer = new byte[count]; System.arraycopy(buffer,0, tmpBuffer,0,count); header += new String(tmpBuffer); // Get host name from HTTP header HTTPRequestParser httpParser = new HTTPRequestParser(header);
// Convert from host name to IP address InetAddress inetAddress = InetAddress.getByName(httpParser.getHost());
// Open socket on deafult HTTP port - 80 httpServerSocket = new Socket(inetAddress.getHostAddress(), HTTP_PORT); DataInputStream inServerStream = new DataInputStream(httpServerSocket.getInputStream()); DataOutputStream outServerStream = new DataOutputStream(httpServerSocket.getOutputStream()); // Send HTTP header to WEB-server outServerStream.writeBytes(header); outServerStream.flush(); int readByteLenght = 0;
while(true){ // Read response from WEB-server if ((readByteLenght = inServerStream.read(buffer)) == -1){ break; } // Send response to remote client outputClientStream.write(buffer,0,readByteLenght); }
outputClientStream.flush(); System.out.println("One more client service--------------------"); clientSocket.close(); httpServerSocket.close();
} catch(Exception e) { e.printStackTrace(); } finally { qThread--; } System.out.println("Thread Close___________________>>>>>"); }
public static int BUFFER_SIZE = 64*1000; public static int HTTP_PORT = 80; }
|
Собственно данный класс занимается соединением к WEB-серверу (получает от удаленного клиента заголовок, вынимает из него host name, соединяется с web-сервером, получает ответ, передает ответ удаленному клиенту) За ранее спасибо
|