http client via java implement.[小糊塗的靈感]

來源:互聯網
上載者:User

import java.net.*;
import java.util.*;
import java.io.*;

// Make an HTTP 1.0 post
public class HTTPForm extends Properties {
    public boolean send(String page, OutputStream outstr) throws IOException
{
 StringBuffer data=new StringBuffer();
 String headers;
 Enumeration i=keys();
 while (i.hasMoreElements()) {
     String key=(String)i.nextElement();
     data.append(URLEncoder.encode(key)
   + "=" +

   URLEncoder.encode((String)get(key))+
   "&");
 }
 data.deleteCharAt(data.length()-1);  // remove last &
 headers="POST " + page + " HTTP/1.0\r\n"+
     "Content-Type: application/x-www-form-urlencoded\r\n" +
     "Content-Length: " + data.length() + "\r\n\r\n";
        outstr.write(headers.getBytes());
 outstr.write(data.toString().getBytes());
 return true;
    }

    // Test main -- duplicates MailFind
    public static void main(String args[]) throws Exception {
        HTTPForm test=new HTTPForm();
 Socket sock=new Socket("new.usps.com",80);
 OutputStream output=sock.getOutputStream();
 InputStream input=sock.getInputStream();
 test.put("tracknbr",args[0]);
 test.send("/cgi-bin/cttgate/ontrack.cgi",output);
// For this example, just dump results
 int c;
 do {
     c=input.read();
     if (c!=-1) System.out.print((char)c);
 } while (c!=-1);
 sock.close();
    }
}

        Socket sock=new Socket("www.google.com",80);
        OutputStream str = sock.getOutputStream();
        InputStream istr=sock.getInputStream();
        String request;
        String data;
       data="";
        // Set up request
        request="GET /intl/zh-CN/ HTTP/1.0\r\n";
        request+="Content-Type: application/x-www-form-urlencoded\r\n";
        request+="Content-Length: " + (data.length())+"\r\n\r\n";
        request+=data;
        // Write it out
        str.write(request.getBytes());
        // For this example, just dump results
        int c;
        do {
            c=istr.read();
            if (c!=-1) System.out.print((char)c);
        } while (c!=-1);
        sock.close();
    }

//

Listing 34.1
Source Code for ReadThread.java
import java.net.*; import java.lang.*; import java.io.*;   /** * A thread dedicated to reading data from a socket connection. */
public class ReadThread extends Thread { protected Socket   connectionSocket; // the socket you are reading from protected DataInputStream inStream;   // the input stream from the socket protected ReadCallback readCallback; /** * Creates   an instance of a ReadThread on a Socket and identifies the callback * that will receive   all data from the socket. * * @param callback the object to be notified when data   is ready * @param connSock the socket this ReadThread will read data from * @exception   IOException if there is an error getting an input stream * for the socket */ public   ReadThread(ReadCallback callback, Socket connSock) throws IOException { connectionSocket   = connSock; readCallback = callback; inStream = new DataInputStream(connSock.getInputStream());   } /** * Closes down the socket connection using the socket's close method */ protected   void closeConnection() { try { connectionSocket.close(); } catch (Exception oops)   { } stop(); } /** * Continuously reads a string from the socket and then calls dataReady   in the * read callback. If you want to read something other than a string, change   * this method and the dataReady callback to handle the appropriate data. */ public   void run() { while (true) { try { // readUTF reads in a string String str = inStream.readUTF();   // Notify the callback that you have a string readCallback.dataReady(str); } catch   (Exception oops) { // Tell the callback there was an error readCallback.dataReady(null);   } } } } 

Listing 34.2 shows the ReadCallback interface, which must be implemented
by a class to receive data from a ReadThread object.

Listing 34.2
Source Code for ReadCallback.java
/** * Implements a callback interface for the ReadConn   class */ public interface ReadCallback { /** * Called when there is data ready on   a ReadConn connection. * @param str the string read by the read thread, If null, the   * connection closed or there was an error reading data */ public void dataReady(String   str); } 
A Simple Socket Client

Using these two classes, you can implement a simple client that connects to a server
and uses a read thread to read the data returned by the server. The corresponding
server for this client is presented in the next section, "The ServerSocket Class."
Listing 34.3 shows the SimpleClient class.

Listing 34.3
Source Code for SimpleClient.java
 import java.io.*; import java.net.*; /** * This class   sets up a Socket connection to a server, spawns * a ReadThread object to read data   coming back from the server, * and starts a thread that sends a string to the server   every * 2 seconds. */ public class SimpleClient extends Object implements Runnable,   ReadCallback { protected Socket serverSock; protected DataOutputStream outStream;   protected Thread clientThread; protected ReadThread reader; public SimpleClient(String   hostName, int portNumber) throws IOException { Socket serverSock = new Socket(hostName,   portNumber); // The DataOutputStream has methods for sending different data types   // in a machine-independent format. It is very useful for sending data // over a socket   connection. outStream = new DataOutputStream(serverSock.getOutputStream()); // Create   a reader thread reader = new ReadThread(this, serverSock); // Start the reader thread   reader.start(); } // These are generic start and stop methods for a Runnable public   void start() { clientThread = new Thread(this); clientThread.start(); } public void   stop() { clientThread.stop(); clientThread = null; } // sendString sends a string   to the server using writeUTF public synchronized void sendString(String str) throws   IOException { System.out.println("Sending string: "+str); outStream.writeUTF(str);   } // The run method for this object just sends a string to the server // and sleeps   for 2 seconds before sending another string public void run() { while (true) { try   { sendString("Hello There!"); Thread.sleep(2000); } catch (Exception oops) { // If   there was an error, print info and disconnect oops.printStackTrace(); disconnect();   stop(); } } } // The disconnect method closes down the connection to the server public   void disconnect() { try { reader.closeConnection(); } catch (Exception badClose) {   // should be able to ignore } } // dataReady is the callback from the read thread.   It is called // whenever a string is received from the server. public synchronized   void dataReady(String str) { System.out.println("Got incoming string: "+str); } public   static void main(String[] args) { try { /* Change localhost to the host you are running   the server on. If it is on the same machine, you can leave it as localhost. */ SimpleClient   client = new SimpleClient("localhost", 4331); client.start(); } catch (Exception cantStart)   { System.out.println("Got error"); cantStart.printStackTrace(); } } } 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.