标题:
[原创]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对象。 例如:
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().
作者:
风灵风之子
时间:
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