java网络程序设计第4章_第1页
java网络程序设计第4章_第2页
java网络程序设计第4章_第3页
java网络程序设计第4章_第4页
java网络程序设计第4章_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章套接字套接字概述套接字(Socket)是由加利福尼亚大学伯克利分校(UniversityofCalifornia,Berkeley)首创的,它允许程序把网络连接看成一个流(Stream),可以向这个流写字节,也可以从这个流读取字节。套接字为程序员屏蔽了网络的底层细节,例如媒体类型、信息包的大小、网络地址、信息的重发等。套接字概述Socket是网络上运行的两个程序间双向通信的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便地编写程序使数据在网络传递。

.Socket类是Java的基础类,用于执行客户端的TCP操作。套接字有两种:一种套接字在服务器端创建,叫做服务器套接字(ServerSocket);还有一种在客户端被创建,就是客户端套接字。套接字概述可以认为Socket是应用程序创建的一个港口码头,应用程序只要把装着货物的集装箱(要发送的数据)放在码头上,就算完成了货物的运送,剩下的工作就由货运公司(驱动程序)去处理了。对接收方来说,应用程序也要创建一个码头,然后就一直等待该码头的货物到达,最后从码头上取走货物(数据)。

套接字概述Socket在应用程序中创建,通过一个绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port。此后,应用程序送给Socket的数据,由Socket交给驱动程序向网络上发送。计算机从网络收到与该Socket绑定的IP+Port相关数据后,由驱动程序交给Socket,应用程序便可以从该Sokcet中取得接收到的数据。套接字概述Socket能执行7种基本操作:连接到远程机器。绑定到端口。接收从远程机器来的绑定端口上的连接。监听到达的数据。发送数据。接收数据。关闭连接。4.1客户端套接字(Socket)当客户程序需要与服务器程序通讯的时候,客户程序在客户机通过构造函数创建一个Socket对象。publicSocket(Stringhost,intport)throwsunknownHostExceptionIOException这个方法建立一个到主机host、端口号为port的套接字,连接到远程主机。4.1客户端套接字(Socket)try{Socketsoc=newSocket("",9090);….//发送数据}catch(unknownHostExceptionuex){}catch(IOExceptione){}4.1客户端套接字(Socket)publicInputStreamgetInputStream()throwsIOException这个方法返回一个输入流,利用这个流就可以从套接字读取数据。通常链接这个流到一个BufferedInputStream或者BufferedReader。publicOutputStreamgetOutputStream()throwsIOException返回一个原始的OutputStream,可以从应用程序写数据到套接字的另一端。通常将它链接到DataOutputStream或者OutputStreamWriter等更方便的类,还可以利用缓冲。4.1客户端套接字(Socket)publicintgetPort()返回Socket连接到远程主机的端口号。publicintgetLocalPort()

一个Socket连接两个终端,方法getLocalPort()返回本地连接终端的端口号。4.2服务器套接字(ServerSocket)每个服务器套接字运行在服务器上特定的端口,监听在这个端口的TCP连接。当远程客户端的Socket试图与服务器指定端口建立连接时,服务器被激活,判定客户程序的连接,并打开两个主机之间固有的连接。一旦客户端与服务器建立了连接,则两者之间就可以传送数据,而数据是通过这个固有的套接字传递的。ServerSocket的工作过程用ServerSocket()方法在指定端口创建一个新的ServerSocket对象。ServerSocket对象调用accept()方法在指定的端口监听到来的连接。accept()一直处于阻塞状态,直到有客户端试图建立连接。这时accept()方法返回连接客户端与服务器的Socket对象。调用getInputStream()方法或者getOutputStream()方法或者两者全调用建立与客户端交互的输入流和输出流。具体情况要看服务器的类型而定。服务器与客户端根据一定的协议交互,直到关闭连接。服务器、客户机或者两者都关闭连接。服务器回到第2步,继续监听下一次的连接。

4.2服务器套接字(ServerSocket)ServerSocket构造函数中最简单的是ServerSocket(intport),当使用它创建一个ServerSocket对象,port参数传递端口号,这个端口就是服务器监听连接请求的端口,如果在这时出现错误将抛出IOException异常对象,否则将创建ServerSocket对象并开始准备接收连接请求。这里端口号port须与客户端指定的一致。默认最大连接数目为504.2服务器套接字(ServerSocket)ServerSocketserver=newServerSocket(9090);While(true){ Socketconnection=server.accept();OutputStreamout=newOutputStream(connection.getOutputStream()); out.write("thejavanetworking"); connection.close();}4.2服务器套接字(ServerSocket)接下来服务程序进入无限循环之中,无限循环从调用ServerSocket的accept()方法开始,在调用开始后accept()方法将导致调用线程阻塞直到连接建立。在建立连接后accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。4.2服务器套接字(ServerSocket)publicServerSocket(intport,intqueuelength)throwsIOExceptionBindException构造方法允许指定端口,用来保存到来连接请求队列的长度,绑定本地网络的地址。4.2服务器套接字(ServerSocket)如果想在端口5300创建一个服务器端口,同时使队列中所能存储的到来的请求数为100,则示范代码如下:try{ServerSocketsocket=newServerSocket(5300,100);}catch(IOExceptione){//异常处理}4.3利用Socket进行网络编程Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream()方法,另一个是getOutputStream()方法。getInputStream()方法可以得到一个输入流,客户端的Socket对象上的getInputStream()方法得到的输入流其实就是从服务器端发回的数据流。getOutputStream()方法得到一个输出流,客户端Socket对象上的getOutputStream()方法返回的输出流就是将要发送到服务器端的数据流服务器端使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。编写服务器程序ServerSocketserver=null;try{ server=newServerSocket(PortNumber); } }catch(IOExceptionioe){ ioe.printStackTrace(); }编写客户程序Socketclient=null;try{client=newSocket(“host”,PortNumber);}catch(UnknowHostExceptionuhe){uhe.PrintStackTrace();}catch(IOExceptione){e.PrintStackTrace();}创建一个数据输入流BufferedReaderis=null;try{is=newBufferedReader(newInputStreamReader(client.getInputStream()));}catch(IOExceptione){e.printStackTrace();}创建一个数据输出流DataOutputStreamos=null;try{ os=newDataOutputStream(client.getOutputStream()); }catch(IOExceptione){e.printStackTrace();}4.4Socket编程示例【例4-1】在本程序中,客户端从命令行输入一个半径值并传送到服务器。服务器根据这个半径值,计算出圆面积发送给客户,客户端显示这个值;客户端输入“bye”命令将结束通信。4.4Socket编程示例

while(goon){outStr=buf.readLine();//读入用户的输入

outToServer.writeUTF(outStr);//写到socket中

outToServer.flush();//清空缓冲区,立即发送

inStr=inFromServer.readUTF();//从socket中读数据

if(!inStr.equals("bye"))System.out.println("从服务器返回的结果是"+inStr);elsegoon=false;}简单的聊天程序

publicvoidactionPerformed(ActionEvente){Strings=msgText.getText();if(s.length()>0){try{outToClient.writeUTF(s);outToClient.flush();showArea.append("我说:"+msgText.getText()+"\n");msgText.setText(null);}catch(IOExceptionel){showArea.append("你的消息:“"+msgText.getText()+"”未能发送出去\n");}}

简单的聊天程序

publicvoidrun(){try{while(true){showArea.append("对方说:"+inFromClient.readUTF()+"\n");Thread.sleep(1000);}}catch(IOExceptionel){}catch(InterruptedExceptione){}}}本章小结Socket是TCP/IP中的基本概念,它负责将TCP/IP包发送到指定的IP地址。也可以看成是在两个程序进行通信连接中的一个端点,一个程序将信息写入Socket中(类似于插座),该Socket将这段信息发送到另一个Socket中(类似于插头),使这段信息能够传送到其他程序。这两端的程序可以是在一台计算机上,也可以在因特网的远程计算机上。本章小结(1)首先调用ServerSocket类以某个端口号为参数,创建一个ServerSocket对象。(2)服务器端程序使用ServerSocket

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论