Board logo

标题: [原创]Java网络编程学习笔记(三) [打印本页]

作者: 风灵风之子    时间: 2005-4-30 02:50     标题: [原创]Java网络编程学习笔记(三)

[这个贴子最后由风灵风之子在 2005/05/08 00:28am 第 1 次编辑] 第三部分客户端套接字 Java程序通常使用如下风格库户端套接字: 1.程序用Socket()构造器创建一个新的套接字 2.套接字尝试连接远程主机 3.一旦连接起来,本地主机和远程主机就从套接字获得输入和输出数据流,并且用这些数据流来传输数据。这个连接是全双工的,两台主机可以同时发送和接收数据 4.当传输的数据完成时,一方或者两方断开连接。 一.Socket类 java.net.Socket类是java的基础类,用于执行客户端TCP操作。 1)public Socket(String host,int port) throws unkownHostException,IOException 这个构造器创建一个TCP到指定主机的指定端口的套接字,并尝试连接到远程主机。在这个构造器中,host变量只是一个主机名(用String表示)或者是一个InetAddress对象。 例如:
  1. import java.net.*;
  2. import java.io.*;
  3. public class LowPortScanner {
  4. public static void main(String[] args)
  5. {
  6. String host="localhost";
  7. if (args.length>0)
  8. {
  9. host=args[0];
  10. }
  11. for (int i=1;i<1024;i++)
  12. {
  13. try
  14. {
  15. Socket s=new Socket(host,i);
  16. System.out.println("There is a server on port "+i+"of "+host);
  17. }
  18. catch (UnknownHostException e)
  19. {
  20. System.err.println(e);
  21. }
  22. catch (IOException e)
  23. {
  24. }
  25. }
  26. }
  27. }
复制代码
2)public Socket(InetAddress host,int port) throws IOException 这个构造器创建一个TCP套接字到指定主机的指定端口,并且尝试建立连接。它通过用一个InetAddress对象到指定的主机而不是主机名来区分。在极少情况下,用户会打开到同一台主机的多个套接字,将主机名转换为ygieInetAddress并重复使用InetAddress来创建套接字效率更高。 例如:
  1. import java.net.*;
  2. import java.io.*;
  3. public class HighPortScanner {
  4. public static void main(String[] args)
  5. {
  6. String host="localhost";
  7. if (args.length>0)
  8. {
  9. host=args[0];
  10. }
  11. try
  12. {
  13. InetAddress theAddress=InetAddress.getByName(host);
  14. for (int i=1024;i<65536;i++)
  15. {
  16. try
  17. {
  18. Socket theSocket=new Socket(theAddress,i);
  19. System.out.println("There is a server on port "+i+"of "+host);
  20. }
  21. catch (IOException e)
  22. {
  23. }
  24. }
  25. }
  26. catch (UnknownHostException e)
  27. {
  28. System.err.println(e);
  29. }
  30. }
  31. }
复制代码
3)public Socket(String host,int port,InetAddress intface,int localPort) throws IOException 这个构造器创建一个套接字到指定主机的指定端口,并且尝试连接。它连接到前两个变量指定的主机地址和端口。从后两个变量指定的主机和端口开始连接。 4)protected Socket() 它创建新的Socket对象但不连接。这个构造器通常被java.net.Socket子类调用。 5)public Socket(SocketImpl impl) 它在创建新的Socket对象时安装SocketImpl对象impl。它创建一个新的Socket对象但不连接。 6)public InetAddress getInetAddress() 给出一个Socket对象,getInetAddress()方法告诉用户Socket连接到那个远程主机,或者如果连接关闭,则getInetAddress()方法给出以前连接的主机。 7)public int getPort() getPort()方法告诉用户Socket连接到远程主机的哪个端口。 8)public int getLocalPort() getLocalPort()方法告诉用户本地主机连接终端的端口号。 9)public InetAddress getLocalAddress() getLoacalAddress()方法告诉用户套接字绑定到哪个网络接口。 例如:
  1. import java.net.*;
  2. import java.io.*;
  3. public class SocketInfo {
  4. public static void main(String[] args)
  5. {
  6. for (int i=0;i<args.length;i++)
  7. {
  8. try
  9. {
  10. Socket theSocket=new Socket(args[i],80);
  11. System.out.println("Conneted to "+theSocket.getInetAddress()
  12. +" on port "+theSocket.getPort()+" from port "
  13. +theSocket.getLocalPort()+"of"
  14. +theSocket.getLocalAddress());
  15. }
  16. catch (UnknownHostException e)
  17. {
  18. System.err.println("I can';t find "+args[i]);
  19. }
  20. catch (SocketException e)
  21. {
  22. System.err.println("Could not connect to "+args[i]);
  23. }
  24. catch (IOException e)
  25. {
  26. System.err.println(e);
  27. }
  28. }
  29. }
  30. }
复制代码
10)public InputStream getInputStream() throws IOException getInputStream()返回一个输入流,它从程序的套接字读取数据。 11)public OutputStream getOutputSteam() throws IOException getOutputStream()返回一个原始OutputStream,用于从应用程序到套接字的另一端写数据。 例如:
  1. import java.net.*;
  2. import java.io.*;
  3. public class EchoClient {
  4. public static void main(String[] args)
  5. {
  6. String hostname="localhost";
  7. if (args.length > 0)
  8. {
  9. hostname=args[0];
  10. }
  11. PrintWriter out=null;
  12. BufferedReader networkIn=null;
  13. try
  14. {
  15. Socket theSocket=new Socket(hostname,7);
  16. networkIn=new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
  17. BufferedReader userIn=new BufferedReader(new InputStreamReader(System.in));
  18. out=new PrintWriter(theSocket.getOutputStream());
  19. System.out.println("Connected to echo server");
  20. while (true)
  21. {
  22. String theLine=userIn.readLine();
  23. if(theLine.equals("."))
  24. break;
  25. out.println(theLine);
  26. System.out.println(networkIn.readLine());
  27. }
  28. }
  29. catch (IOException e)
  30. {
  31. System.err.println(e);
  32. }
  33. finally
  34. {
  35. try
  36. {
  37. if (networkIn !=null)
  38. networkIn.close();
  39. if (out !=null)
  40. out.close();
  41. }
  42. catch (IOException e)
  43. {
  44. }
  45. }
  46. }
  47. }
复制代码
二.关闭套接字 public synchronized void close() throws IOException 当用户自始至终使用套接字时,应当调用Socket的close()方法断开连接。 例如:
  1. import java.net.*;
  2. import java.io.*;
  3. public class PortScanner {
  4. public static void main(String[] args)
  5. {
  6. String host="localhost";
  7. if (args.length > 0)
  8. {
  9. host=args[0];
  10. }
  11. Socket connection=null;
  12. try
  13. {
  14. InetAddress theAddress=InetAddress.getByName(host);
  15. for (int i=1;i<65536;i++)
  16. {
  17. try
  18. {
  19. connection=new Socket(host,i);
  20. System.out.println("There is a server on port "+i+" of "+host);
  21. }
  22. catch (IOException e)
  23. {
  24. }
  25. finally
  26. {
  27. try
  28. {
  29. if (connection !=null)
  30. connection.close();
  31. }
  32. catch (IOException e)
  33. {
  34. }
  35. }
  36. }
  37. }
  38. catch (UnknownHostException e)
  39. {
  40. System.err.println(e);
  41. }
  42. }
  43. }
复制代码
三.半关闭的套接字 public void shutdownInput() throws IOException public void shutdownOutput() throws IOException 这两个方法只能关闭连接的一端。 四.Object方法 Socket类只重载自java.lang.Object的标准方法toString().
作者: 风灵风之子    时间: 2005-4-30 02:53     标题: [原创]Java网络编程学习笔记(三)

PS:前两部分在
http://www.thysea.com/lb/cgi-bin/topic.cgi?forum=127&topic=1023&show=60
已经不能回帖了,郁闷。。




欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/) Powered by Discuz! 7.2