| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
Java 套接字(Socket)详解

作者:未知    文章来源:网络    点击数:    更新时间:2007-6-3
 

 

4创建Socket客户

我们将在本部分讨论的示例将阐明在Java代码中如何使用Socket和ServerSocket。客户机用Socket连接到服务器。服务器用ServerSocket在端口1001侦听。客户机请求服务器C:驱动器上的文件内容。

创建RemoteFileClient类
importjava.io.*;
importjava.net.*;
publicclassRemoteFileClient{protectedBufferedReadersocketReader;
protectedPrintWritersocketWriter;
protectedStringhostIp;
protectedinthostPort;
//构造方法publicRemoteFileClient(StringhostIp,inthostPort){this.hostIp=hostIp;this.hostPort=hostPort;}
//向服务器请求文件的内容
publicStringgetFile(StringfileNameToGet){StringBufferfileLines=newStringBuffer();
try{socketWriter.println(fileNameToGet);
socketWriter.flush();
Stringline=null;
while((line=socketReader.readLine())!=null)fileLines.append(line+"\n");}
catch(IOExceptione){System.out.println("Errorreadingfromfile:"+fileNameToGet);}returnfileLines.toString();}
//连接到远程服务器
publicvoidsetUpConnection(){try{Socketclient=newSocket(hostIp,hostPort);
socketReader=newBufferedReader(newInputStreamReader(client.getInputStream()));
socketWriter=newPrintWriter(client.getOutputStream());}
catch(UnknownHostExceptione){System.out.println("Error1settingupsocketconnection:unknownhostat"+hostIp+":"+hostPort);}
catch(IOExceptione){System.out.println("Error2settingupsocketconnection:"+e);}}
//断开远程服务器
publicvoidtearDownConnection(){try{socketWriter.close();
socketReader.close();}catch(IOExceptione){System.out.println("Errortearingdownsocketconnection:"+e);}}publicstaticvoidmain(Stringargs[]){RemoteFileClientremoteFileClient=newRemoteFileClient("127.0.0.1",1001);
remoteFileClient.setUpConnection();
StringBufferfileContents=newStringBuffer();
fileContents.append(remoteFileClient.getFile("RemoteFileServer.java"));
//remoteFileClient.tearDownConnection();
System.out.println(fileContents);}}

首先我们导入java.net和java.io。java.net包为您提供您需要的套接字工具。java.io包为您提供对流进行读写的工具,这是您与TCP套接字通信的唯一途径。

我们给我们的类实例变量以支持对套接字流的读写和存储我们将连接到的远程主机的详细信息。

我们类的构造器有两个参数:远程主机的IP地址和端口号各一个,而且构造器将它们赋给实例变量。

我们的类有一个main()方法和三个其它方法。稍后我们将探究这些方法的细节。现在您只需知道setUpConnection()将连接到远程服务器,getFile()将向远程服务器请求fileNameToGet的内容以及tearDownConnection()将从远程服务器上断开。

实现main()

这里我们实现main()方法,它将创建RemoteFileClient并用它来获取远程文件的内容,然后打印结果。main()方法用主机的IP地址和端口号实例化一个新RemoteFileClient(客户机)。然后,我们告诉客户机建立一个到主机的连接。接着,我们告诉客户机获取主机上一个指定文件的内容。最后,我们告诉客户机断开它到主机的连接。我们把文件内容打印到控制台,只是为了证明一切都是按计划进行的。

建立连接

这里我们实现setUpConnection()方法,它将创建我们的Socket并让我们访问该套接字的流:
publicvoidsetUpConnection(){try{Socketclient=newSocket(hostIp,hostPort);
socketReader=newBufferedReader(newInputStreamReader(client.getInputStream()));
socketWriter=newPrintWriter(client.getOutputStream());}
catch(UnknownHostExceptione){System.out.println("Error1settingupsocketconnection:unknownhostat"+hostIp+":"+hostPort);}
catch(IOExceptione){System.out.println("Error2settingupsocketconnection:"+e);}}

setUpConnection()方法用主机的IP地址和端口号创建一个Socket:

Socketclient=newSocket(hostIp,hostPort);

我们把Socket的InputStream包装进BufferedReader以使我们能够读取流的行。然后,我们把Socket的OutputStream包装进PrintWriter以使我们能够发送文件请求到服务器:

socketReader=newBufferedReader(newInputStreamReader(client.getInputStream()));
socketWriter=newPrintWriter(client.getOutputStream());

请记住我们的客户机和服务器只是来回传送字节。客户机和服务器都必须知道另一方即将发送的是什么以使它们能够作出适当的响应。在这个案例中,服务器知道我们将发送一条有效的文件路径。

当您实例化一个Socket时,将抛出UnknownHostException。这里我们不特别处理它,但我们打印一些信息到控制台以告诉我们发生了什么错误。同样地,当我们试图获取Socket的InputStream或OutputStream时,如果抛出了一个一般IOException,我们也打印一些信息到控制台。

与主机交谈

这里我们实现getFile()方法,它将告诉服务器我们想要什么文件并在服务器传回其内容时接收该内容。
publicStringgetFile(StringfileNameToGet){StringBufferfileLines=newStringBuffer();
try{socketWriter.println(fileNameToGet);
socketWriter.flush();
Stringline=null;
while((line=socketReader.readLine())!=null)fileLines.append(line+"\n");}
catch(IOExceptione){System.out.println("Errorreadingfromfile:"+fileNameToGet);}returnfileLines.toString();}

对getFile()方法的调用要求一个有效的文件路径String。它首先创建名为fileLines的StringBuffer,fileLines用于存储我们读自服务器上的文件的每一行。

StringBufferfileLines=newStringBuffer();

在try{}catch{}块中,我们用PrintWriter把请求发送到主机,PrintWriter是我们在创建连接期间建立的。

socketWriter.println(fileNameToGet);socketWriter.flush();

请注意这里我们是flush()该PrintWriter,而不是关闭它。这迫使数据被发送到服务器而不关闭Socket。

一旦我们已经写到Socket,我们就希望有一些响应。我们不得不在Socket的InputStream上等待它,我们通过在while循环中调用BufferedReader上的readLine()来达到这个目的。我们把每一个返回行附加到fileLinesStringBuffer(带有一个换行符以保护行):

Stringline=null;while((line=socketReader.readLine())!=null)fileLines.append(line+"\n");

断开连接

这里我们实现tearDownConnection()方法,它将在我们使用完毕连接后负责“清除”。tearDownConnection()方法只是分别关闭我们在Socket的InputStream和OutputStream上创建的BufferedReader和PrintWriter。这样做会关闭我们从Socket获取的底层流,所以我们必须捕捉可能的IOException。

上一页  [1] [2] [3] [4] 下一页


  • 上一篇文章:

  • 下一篇文章: 没有了
  • 相关文章