socket点点点

    技术2022-05-14  1

    总结如下:

    1:如何通过socket代理来访问服务端:

    String proxyHost = "192.168.204.212";   String proxyPort = "1080";     //通知Java要通过代理进行连接。   System.getProperties().put("socksProxySet","true");   //指定代理所在的机器   System.getProperties().put("socksProxyHost",proxyHost);   //指定代理监听的端口。   System.getProperties().put("socksProxyPort",proxyPort);      String host = "134.01.69.80";   int port = 12086;   System.out.println("connetioning:" + host + ":" + port);   server = new Socket(host, port);  

    二:老socket传递Object对象:

    要传递的对象:

    public class Employee implements Serializable {             private int employeeNumber;           private String employeeName;             Employee(int num, String name) {              employeeNumber = num;              employeeName= name;           }              public int getEmployeeNumber() {              return employeeNumber ;           }             public void setEmployeeNumber(int num) {              employeeNumber = num;           }             public String getEmployeeName() {              return employeeName ;           }             public void setEmployeeName(String name) {              employeeName = name;           }        }   

    client:

    public class Client {       public static void main(String[] arg) {           try {               Employee joe = new Employee(150"Joe");               System.out.println("employeeNumber= " + joe.getEmployeeNumber());               System.out.println("employeeName= " + joe.getEmployeeName());               Socket socketConnection = new Socket("127.0.0.1"11111);               ObjectOutputStream clientOutputStream = new ObjectOutputStream(                       socketConnection.getOutputStream());               ObjectInputStream clientInputStream = new ObjectInputStream(                       socketConnection.getInputStream());               clientOutputStream.writeObject(joe);               joe = (Employee) clientInputStream.readObject();               System.out.println("employeeNumber= " + joe.getEmployeeNumber());               System.out.println("employeeName= " + joe.getEmployeeName());               clientOutputStream.close();               clientInputStream.close();           } catch (Exception e) {               System.out.println(e);           }       }   }  

    server端:

    java 代码 public class Server {       public static void main(String[] arg) {           Employee employee = null;           try {               ServerSocket socketConnection = new ServerSocket(11111);               System.out.println("Server Waiting");               Socket pipe = socketConnection.accept();               ObjectInputStream serverInputStream = new ObjectInputStream(pipe                       .getInputStream());               ObjectOutputStream serverOutputStream = new ObjectOutputStream(pipe                       .getOutputStream());               employee = (Employee) serverInputStream.readObject();               employee.setEmployeeNumber(256);               employee.setEmployeeName("li");               serverOutputStream.writeObject(employee);               serverInputStream.close();               serverOutputStream.close();           } catch (Exception e) {               System.out.println(e);           }       }   }  

    三:nio socket传递Object:

    client:

    public class Client {       private String hostname;              private int port;              public Client(String hostname, int port)       {           this.hostname = hostname;           this.port = port;       }         public static void main(String[] args) {           String hostname = "192.168.0.81";           int port = 8234;           Student stu = new Student();           stu.setId(849);           stu.setName("Squall");           Client client = new Client(hostname, port);           try {               client.write(stu);           } catch (IOException e) {               // TODO Auto-generated catch block               e.printStackTrace();           }       }         public void write(Object obj) throws IOException {           SocketChannel channel = null;           try {               channel = SocketChannel.open(new InetSocketAddress(hostname, port));               ByteBuffer buf = Client.getByteBuffer(obj);               channel.write(Client.getByteBuffer(obj));               channel.write(Client.getByteBuffer(obj));           } catch (Exception e) {               e.printStackTrace();           } finally {               channel.close();           }       }              public static ByteBuffer getByteBuffer(Object obj) throws IOException       {           ByteArrayOutputStream bOut = new ByteArrayOutputStream();           ObjectOutputStream out = new ObjectOutputStream(bOut);           out.writeObject(obj);           out.flush();           byte[] arr = bOut.toByteArray();           System.out.println("Object in " + arr.length + " bytes");           ByteBuffer bb = ByteBuffer.wrap(arr);           out.close();                      return bb;       }   }  

    server端:

    java 代码 public class Server {         public static void main(String[] args) {           System.out.println("in server!");           ServerThread server = new ServerThread();           new Thread(server).start();       }         static class ServerThread implements Runnable {             public void run() {               try {                   ServerSocketChannel sc = ServerSocketChannel.open();                     ServerSocket s = sc.socket();                   s.bind(new InetSocketAddress(8234));                   while (true) {                       Socket incoming = s.accept();                       Runnable r = new GetObjThread(incoming);                       Thread t = new Thread(r);                       t.start();                   }               } catch (Exception e) {                   e.printStackTrace();               }           }       }         static class GetObjThread implements Runnable {           public GetObjThread(Socket s) {               incoming = s;           }             public void run() {               try {                   SocketChannel sc = incoming.getChannel();                   ByteBuffer bbIn = ByteBuffer.allocate(1024);                   sc.read(bbIn);                                      sc.close();                   bbIn.flip();                   ByteArrayInputStream bIn = new ByteArrayInputStream(bbIn                           .array());                   ObjectInputStream in = new ObjectInputStream(bIn);                   Student nStu = (Student) in.readObject();                   System.out.println("student id is " + nStu.getId() + "/n"                          + "student name is " + nStu.getName());               } catch (IOException e) {                   e.printStackTrace();               } catch (ClassNotFoundException e) {                   e.printStackTrace();               }           }             private Socket incoming;       }   }  

    四:备份一个有用的util class:对象序列化,反序列化(序列化对象转byte[],ByteBuffer, byte[]转object: 

    java 代码 public class ByteUtil {       public static byte[] getBytes(Object obj) throws IOException       {           ByteArrayOutputStream bout = new ByteArrayOutputStream();           ObjectOutputStream out = new ObjectOutputStream(bout);           out.writeObject(obj);           out.flush();           byte[] bytes = bout.toByteArray();           bout.close();           out.close();                      return bytes;       }              public static Object getObject(byte[] bytes) throws IOException, ClassNotFoundException       {              ByteArrayInputStream bi = new ByteArrayInputStream(bytes);              ObjectInputStream oi = new ObjectInputStream(bi);              Object obj = oi.readObject();              bi.close();              oi.close();           return obj;       }              public static ByteBuffer getByteBuffer(Object obj) throws IOException       {           byte[] bytes = ByteUtil.getBytes(obj);           ByteBuffer buff = ByteBuffer.wrap(bytes);                      return buff;       }   }  

    五:如何通过xml传递Object对象:

    可以先把object转成一个byte[]数组,然后用base64编码成一个base64格式的String,放入xml的CDATA中,就可以传了。

    接收方,收到该xml后,把CDATA中的String用base64解码为byte[],进而根据四中的方法,还原为object:

    java 代码 public class Base64 {         public static String getEncodedText(byte[] bytes) {             try {               BASE64Encoder encoder = new BASE64Encoder();               String text = encoder.encode(bytes);               return text;                   } catch (Exception e) {               e.printStackTrace();               return null;           }                }              public static byte[] decode(String src)        {           BASE64Decoder decoder = new BASE64Decoder();           try {               return decoder.decodeBuffer(src);           } catch (IOException e) {               // TODO Auto-generated catch block               e.printStackTrace();               return null;           }       }              public static void main(String[] args) {           String s = "ly89";           byte[] bytes = s.getBytes();           String  encode = Base64.getEncodedText(bytes);           System.out.println("the encode string is: " + encode);             byte[] dbytes = Base64.decode(encode);           for (int i = 0; i < bytes.length; i++) {               System.out.println(dbytes[i]);                     }       }   } 


    最新回复(0)