[这个贴子最后由风灵风之子在 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对象。
例如:- import java.net.*;
- import java.io.*;
- public class LowPortScanner {
- public static void main(String[] args)
- {
- String host="localhost";
- if (args.length>0)
- {
- host=args[0];
- }
- for (int i=1;i<1024;i++)
- {
- try
- {
- Socket s=new Socket(host,i);
- System.out.println("There is a server on port "+i+"of "+host);
- }
- catch (UnknownHostException e)
- {
- System.err.println(e);
- }
- catch (IOException e)
- {
- }
- }
- }
- }
复制代码 2)public Socket(InetAddress host,int port) throws IOException
这个构造器创建一个TCP套接字到指定主机的指定端口,并且尝试建立连接。它通过用一个InetAddress对象到指定的主机而不是主机名来区分。在极少情况下,用户会打开到同一台主机的多个套接字,将主机名转换为ygieInetAddress并重复使用InetAddress来创建套接字效率更高。
例如:- import java.net.*;
- import java.io.*;
- public class HighPortScanner {
- public static void main(String[] args)
- {
- String host="localhost";
- if (args.length>0)
- {
- host=args[0];
- }
- try
- {
- InetAddress theAddress=InetAddress.getByName(host);
- for (int i=1024;i<65536;i++)
- {
- try
- {
- Socket theSocket=new Socket(theAddress,i);
- System.out.println("There is a server on port "+i+"of "+host);
- }
- catch (IOException e)
- {
- }
- }
- }
- catch (UnknownHostException e)
- {
- System.err.println(e);
- }
- }
- }
复制代码 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()方法告诉用户套接字绑定到哪个网络接口。
例如:- import java.net.*;
- import java.io.*;
- public class SocketInfo {
- public static void main(String[] args)
- {
- for (int i=0;i<args.length;i++)
- {
- try
- {
- Socket theSocket=new Socket(args[i],80);
- System.out.println("Conneted to "+theSocket.getInetAddress()
- +" on port "+theSocket.getPort()+" from port "
- +theSocket.getLocalPort()+"of"
- +theSocket.getLocalAddress());
- }
- catch (UnknownHostException e)
- {
- System.err.println("I can';t find "+args[i]);
- }
- catch (SocketException e)
- {
- System.err.println("Could not connect to "+args[i]);
- }
- catch (IOException e)
- {
- System.err.println(e);
- }
- }
- }
- }
复制代码 10)public InputStream getInputStream() throws IOException
getInputStream()返回一个输入流,它从程序的套接字读取数据。
11)public OutputStream getOutputSteam() throws IOException
getOutputStream()返回一个原始OutputStream,用于从应用程序到套接字的另一端写数据。
例如:- import java.net.*;
- import java.io.*;
- public class EchoClient {
- public static void main(String[] args)
- {
- String hostname="localhost";
- if (args.length > 0)
- {
- hostname=args[0];
- }
- PrintWriter out=null;
- BufferedReader networkIn=null;
- try
- {
- Socket theSocket=new Socket(hostname,7);
- networkIn=new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
- BufferedReader userIn=new BufferedReader(new InputStreamReader(System.in));
- out=new PrintWriter(theSocket.getOutputStream());
- System.out.println("Connected to echo server");
- while (true)
- {
- String theLine=userIn.readLine();
- if(theLine.equals("."))
- break;
- out.println(theLine);
- System.out.println(networkIn.readLine());
- }
- }
- catch (IOException e)
- {
- System.err.println(e);
- }
- finally
- {
- try
- {
- if (networkIn !=null)
- networkIn.close();
- if (out !=null)
- out.close();
- }
- catch (IOException e)
- {
- }
- }
- }
- }
复制代码 二.关闭套接字
public synchronized void close() throws IOException
当用户自始至终使用套接字时,应当调用Socket的close()方法断开连接。
例如:- import java.net.*;
- import java.io.*;
- public class PortScanner {
- public static void main(String[] args)
- {
- String host="localhost";
- if (args.length > 0)
- {
- host=args[0];
- }
- Socket connection=null;
- try
- {
- InetAddress theAddress=InetAddress.getByName(host);
- for (int i=1;i<65536;i++)
- {
- try
- {
- connection=new Socket(host,i);
- System.out.println("There is a server on port "+i+" of "+host);
- }
- catch (IOException e)
- {
- }
- finally
- {
- try
- {
- if (connection !=null)
- connection.close();
- }
- catch (IOException e)
- {
- }
- }
- }
- }
- catch (UnknownHostException e)
- {
- System.err.println(e);
- }
- }
- }
复制代码 三.半关闭的套接字
public void shutdownInput() throws IOException
public void shutdownOutput() throws IOException
这两个方法只能关闭连接的一端。
四.Object方法
Socket类只重载自java.lang.Object的标准方法toString().
|