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

下载本文档

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

文档简介

1、面向对象程序设计Java本章相关词汇本章相关词汇单 词说 明Internet Protocol(IP)互联网协议net网络,网状物socket套接字,插座server服务器,服务端client客户,客户端port端口accept接收,认可本章目标本章目标网络基础知识IP地址与端口包 InetAddress Socket ServerSocket扩展IO流的相关知识计算机网络与通信计算机网络与通信通信是人类生活中最重要的需求之一;通信是指:对语言、文字、声音和图片以及其它任何类型的相关数据进行传输;计算机的出现以及网络的构成,使得数据通信更加快速有效。计算机网络的基本原理计算机网络的基本原理计算

2、机网络就是利用通信线路连接起来的、相互独立的计算机集合。使用网卡、电使用网卡、电缆、集线器等缆、集线器等连接设备连接连接设备连接计算机以组成计算机以组成网络。网络。计算机网络的OSI 体系结构体系结构 TCP/IPTCP/IP(传输控制协议传输控制协议/ /网间协议)是网间协议)是InternetInternet的主要协议,定义了计算的主要协议,定义了计算机和外设进行通信所使用机和外设进行通信所使用的规则。的规则。TCP/IPTCP/IP网络参考网络参考模型包括模型包括五个五个层次:应用层次:应用层、传输层、网络层、链层、传输层、网络层、链路层、物理层。路层、物理层。TCP/IP网络参考模型网

3、络参考模型应应 用用 层层网网 络络 层层传传 输输 层层物理物理+ +数据链路层数据链路层TCP/IPTCP/IP参考模型参考模型IP地址地址网络中有多台计算机,它们必须通过某种标识来区分每一台机器,这就是IP地址。在网络寻找某一台计算机都是依靠它的IP地址;IP地址由4个0-255之间的数字组成;如:为了方便使用,人们给每个结点起了一个名字,把名字与IP地址建立对应关系,这就是域名域名系统DNS,凡域名空间有定义的域名都可以有效地转换成IP地址。查看查看IP地址地址Ipconfig如果是win2000先运行cd C:WINNTsystem32,再运行Ipconfig如

4、果是win xp先运行cd C:WINDOWSsystem32,再运行Ipconfig特殊的特殊的IP地址地址对于本地计算机(就是你正在使用的那台计算机),有两种方法标识它: 用主机名标识:localhost 用IP地址标识: 以上两者是等价的端端 口口一台计算机上可能同时运行多个网络应用程序,IP地址只能确保把数据送到指定的计算机,但不能保证把这些数据传递给哪个网络程序;为了让一个计算机可以同时运行多个网络程序,就引入了另外一个概念端口(port)。端口使用一个16位的数字来表示,它的范围是065535,1024以下的端口号保留给预定义的服务,如:http使用80端口;网络

5、间通信其实是在网络应用程序端口之间进行的。端端 口口系统端口号列表系统端口号列表URLURL(Uniform Resource Locator)-统一资源定位符,表示Internet上某一资源的地址。简单地说,URL就是Web地址,俗称“网址”。 URL组成组成: 协议名和资源名。protocol:/resourceName协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、gopher、file等。资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。 如:http: / :80/index.htmlURL举例举例:

6、http:/ 、URL、Socket、Datagram。 InetAddress面向的是IP层,用于标识网络上的硬件资源。 URL这种方法是通过URL的网络资源表达式形式确定数据在网络中的位置,利用URL对象中提供的方法,直接读入网络中的数据,或者将本地数据传送到网络的另一端。Socket是指两个程序通过网络进行通信的一种方式,在TCP/IP协议下的客户服务器软件通常使用socket来进行信息交流,这种方式也是传统中常用的一种方式。这种工作方式类似两个人打电话。Datagram是一种面向非连接的、以数据报方式工作的通信,适用于网络状况不稳定下的数据传输和访问。这种工作方式类似邮局寄邮件。 包包

7、J包中包含多个用于网络编程的接口和类,常用的有: InetAddress:该类用来代表一个IP地址。 URL:该类用来代表一个统一资源定位符。 ServerSocket:该类实现服务器端Socket。 Socket:该类实现客户端Socket。要进行网络通讯编程,必须导入此包。.InetAddress该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。 该类无法直接实例化,只能通过下列方法获得实例:方 法 原 型说 明static InetAddress getByName(String host)throws UnknownHostException返回指定主机

8、的IP地址对象static InetAddress getLocalHost()throws UnknownHostException返回本地主机的IP地址对象String getHostName()返回此 InetAddress 对象的主机名称网络编程的异常处理网络编程的异常处理可能产生的异常:可能产生的异常:BindExceptionBindException、ConnectExceptionConnectException、MalformedURLExceptionMalformedURLException、NoRouteToHostExceptionNoRouteToHostExcep

9、tion、ProtocolExceptionProtocolException、SocketExceptionSocketException、UnknownHostExceptionUnknownHostException、UnknownServiceExceptionUnknownServiceExceptionimport .*; /导入包public class InetAddressDemo public static void main(String args) try /获得本地主机的IP地址 InetAddress add1 = InetAddress.getLocalHost(

10、); System.out.println(当前本地主机: + add1); /通过DNS域名解析,获得相应服务的主机地址 InetAddress add2 = InetAddress.getByName(); System.out.println(网易服务器主机: + add2); /根据字符串表现形式的IP地址获得相应的主机地址(如果网络上有该IP地址的话) InetAddress add3 = InetAddress.getByName(2); System.out.println(IP地址为2的主机: + add3); catch (Unkn

11、ownHostException uhe) uhe.printStackTrace(); InetAddressInetAddress示例示例上机练习上机练习查看本机的IP地址编程获取本机的IP地址和本校校园网的IP地址InetAddress的其它方法的其它方法方 法 原 型说 明byte getAddress()返回此 InetAddress 对象的原始 IP 地址String getHostAddress()返回此 InetAddress 对象的IP地址字符串String getHostName()返回此 InetAddress 对象的主机名称boolean equals(Object o

12、ther)判断两个IP地址是否相等String toString()返回此 InetAddress 对象的字符串表现形式(主机名/IP地址)URL类及其构造方法类及其构造方法要使用URL进行通信,就要使用URL类创建其对象,通过引用URL类定义的方法完成网络通信。创建URL类对象要使用包中提供的.URL类的构造方法。URL类的构造方法类的构造方法功能说明功能说明public URL(String str)使用URL字符串创建URL对象public URL(String protocol, String host,String file)通过指定协议名、主机名、文件名,端口使用默认值,创建URL

13、对象public URL(String protocol, String host, String port,String file)通过指定协议名、主机名、文件名和端口号,创建URL对象public URL(URL content, String str)通过在已知的URL路径上增加细节的办法创建URL对象URL 类的方法类的方法URL 类类功能说明功能说明int getPort()获得端口号,如果端口没有设置,返回-1String getProtocol()获得协议名,如果协议没有设置,返回nullString getHost()获得主机名,如果主机没有设置,返回nullString ge

14、tFile()获得文件名,如果文件没有设置,返回nullBoolean equals(Object obj)与指定的URL对象obj 进行比较,如果相同返回true,否则返回false Final InputStreamOpenStream()获得一个输入流,若获取失败,则抛出一个java.io.Exception异常String toString()将此URL对象转换为字符串的形式URL程序例一程序例一/URLReader, 获取网页并按行打印import .*;import java.io.*;public class Network_1 public static void main(S

15、tring args) throws ExceptionURL hfut = new URL(); /URL数据数据- InputStreamReader对象对象 - BufferedReader对象对象 - 程序处理程序处理BufferedReader in = new BufferedReader(new InputStreamReader( hfut.openStream() ) );String inputLine;/打印输出HTMLwhile ( (inputLine = in.readLine() ) != null ) System.out.p

16、rintln(inputLine);/关闭缓冲区in.close(); CodeURLConnection类类使用URL类可以很简单地获得信息,但如果在获取到信息的同时还能向远程的计算机节点,就需要使用URLConnection类。创建URLConnection类的对象,先创建一个URL对象,然后调用该对象的openConnection()方法就会返回一个对应URL地址的URLConnection对象。/创建URL对象URL url=new URL(“http:/”); /创建链接通道URLConnection connect=url.openConnection();内容详见内容详见.URL

17、Connection类类URLConnection类类1建立输入/输出流 URLConnection类类不仅可以使用getInputStream()方法获得URL节点的信息,还可以采用getOutputStream()方法向URL节点处传送信息。在建立URLConnection类对象的同时就已经在本级和URL节点之上建立了一条HTTP通道。HTTP是一个,发送信息之前要附加确认双方身份的信息。例: DataInputStream datain=new DataInputStream(connect.getInputStream();URL程序例二程序例二Code/URLConnectionRe

18、ader/使用使用.URLConnection连接到互连网,获取网页并按行打印连接到互连网,获取网页并按行打印import .*;import java.io.*;public class Network_2 public static void main(String args) throws Exception /URL对象对象- URLConnection对象对象 - InputStreamReader -BufferedReader URL hfut = new URL(http:/ URLConnection uc = hfut.openConnection(); BufferedR

19、eader in = new BufferedReader( new InputStreamReader( uc.getInputStream() ); String inputLine; while (inputLine = in.readLine() != null) System.out.println(inputLine); in.close(); 网络通讯的过程网络通讯的过程网络通讯基于“请求-响应”模型。为了理解这个模型,先来看一个审讯的场面警察:姓名 嫌疑犯:XXX 警察:性别 嫌疑犯:男 警察:年龄 嫌疑犯:29 在这个例子中,警察问一句,嫌疑犯回答一句,如果警察不问,则嫌疑犯

20、保持沉默。这种一问一答的形式就是网络中的“请求-响应”模型。也就是通讯的一端发送数据,另外一端反馈数据,网络通讯都基于该模型。客户端客户端/服务器服务器(C/S)模式模式在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。客户端/服务器的优势在于:服务器和客户端分摊任务,分别负责部分处理工作;服务器可以同时为多台客户端服务;多个客户端可以同时访问服务器上的相同数据。服务器端网络编程步骤 监听端口监听端口 服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计

21、算机的某个固定端口即可。 这个端口就是服务器端开放给客户端的端口。 获得连接获得连接当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,如客户端IP地址等,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。 交换数据交换数据 服务器端接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送。 关闭连接关闭连接 当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。客户

22、端网络编程步骤 建立网络连接建立网络连接 在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。 交换数据交换数据 交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。 根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。 关闭网络连接关闭网络连接 在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源。套接字套接字socket网络上计算机通过TCP/IP协议进行通信,而套接字(socket)则将这些通

23、信协议进行了封装;TCP/IP套接字用于在主机和Internet之间建立可靠的、双向的、持续的、点对点的流式连接;socket用于描述用于描述IP地址和端口地址和端口,应用程序通过套接字向,应用程序通过套接字向网络发出请求或者应答网络请求;网络发出请求或者应答网络请求;客户端和服务器通过套接字建立连接和通信。Socket是是TCP/IP协议中的协议中的传输层传输层接口,是建立在稳定连接口,是建立在稳定连接基础上的以流传输数据的通信方式。它是目前实现客接基础上的以流传输数据的通信方式。它是目前实现客户户/服务器服务器(Client/Server)模式应用程序的主要手段。模式应用程序的主要手段。S

24、ocket通信机制通信机制Socket通信机制提供了两种通信方式:有连接方式(TCP)和无连接方式(UDP数据报)。有连接方式中,通信双方在开始时必须进行一次连接过程,建立一条通信链路。通信链路提供了可靠的、双向的字节流服务。无连接方式中,通信双方不存在一个连接过程,一次网络I/O以一个数据报形式进行,而且每次网络I/O可以和不同主机的不同进程进行。无连接方式开销小于有连接方式,但是所提供的数据传输服务不可靠,不能保证数据报一定到达目的地。Java语言同时支持有连接和数据报通信方式,在这两种方式中都采用了Socket表示通信过程中的端点。主机甲主机甲套接字通信原理套接字通信原理A程序程序主机乙

25、主机乙B程序程序TCP/IP协议协议网网 卡卡网络管理软件网络管理软件socketsocket主机甲上的主机甲上的A程程序将一段数据写序将一段数据写入入socket中中 主机乙上的主机乙上的B程程序从序从socket中读中读取这段数据取这段数据 Socket通信过程通信过程Server端创建ServerSocket对象监听某端口接受Client端的请求,用accept()返回的Socket建立连接关闭Socket,结束与当前Client的通信,等待其它请求关闭ServerSocket对象,结束监听服务Client端创建Socket对象,向Server的监听服务发送连接请求建立连接数据通信通过向

26、Socket读写数据完成与Client端通信通过向Socket读写数据完成与Server端通信关闭Socket,结束Server端的通信拆分连接在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以.Socket类代表客户端连接,以.ServerSocket类代表服务器端连接。.SocketSocket类用于创建套接字对象,其构造方法共有9种重载,常用的有如下几种:套接字会因为网络的连接中断而失效,所以对它的操作都有可能抛出IOException。构 造 方 法说 明Socket(InetAddress address, int port) throws IOExcept

27、ion用预先存在的InetAddress对象和端口创建一个与本地主机连接的套接字Socket(String hostName, int port)throws UnknownHostException, IOException创建一个本地主机与给定名称的主机和端口连接的套接字Socket与与I/O流流Java是通过使用流模式来实现网络信息交互的,这种模式下,一个接口同时拥有两个流输入流和输出流。Socket的常用方法的常用方法一旦Socket对象被成功创建,就可以获得访问与之相关的输入/输出流的权力,通过流操作从套接字中发送(输出)和接收(输入)数据:方 法 原 型说 明InputStream

28、 getInputStream()throws IOException获得当前套接字的输入流OutputStream getOutputStream()throws IOException获得当前套接字的输出流void close()throws IOException关闭当前套接字Socket的其它方法的其它方法使用下面的方法,可以在任何时候检查套接字的地址和与之相关的端口信息方 法 原 型说 明InetAddress getInetAddress()返回与当前套接字连接的远程主机的InetAddress对象,如未连接,则返回nullInt getPort()返回与当前套接字连接的远程主机端

29、口InetAddress getLocalAddress()返回与当前套接字绑定的本地主机的InetAddress对象int getLocalPort()返回与当前套接字绑定的本地主机端口.ServerSocketServerSocket类用来创建服务器套接字,它监听本地或远程客户程序通过公共端口的连接;ServerSocket类有4个重载的构造方法,以下是常用的:ServerSocket的常用方法如下:构 造 方 法说 明ServerSocket(int port)throws IOException创建服务套接字,它负责侦听由port指定的端口。方 法 原 型说 明Socket accep

30、t()throws IOException等待并侦听来自客户端的请求,一旦接收到,返回一个与客户进行通信的Socketvoid close()throws IOException关闭当前服务器套接字Socket编程编程编写服务器端程序创建服务器套接字(ServerSocket),绑定到指定端口;调用accept方法,侦听来自客户端的请求,如果客户发出请求,则接受连接,返回通信套接字(Socket);调用Socket的getInputStream和getOutputStream方法,获得输入/输出流,开始网络数据的接收和发送;关闭通信套接字,关闭服务器套接字。编写客户端程序创建套接字(Socke

31、t) ,向服务器的侦听端口发出请求;与服务器正确连接后,调用Socket的getInputStream和getOutputStream方法,获得输入/输出流,开始网络数据的接收和发送;关闭通信套接字。ClientServerSocket编程示意图编程示意图ServerSocket(int port)InputStream getInputStream()OutputStream getOutputStream()close()close()InputStream getInputStream()OutputStream getOutputStream()Socket(InetAddress a

32、ddress, int port)Socket accept()ServerSocket 类类l 在在 Server Server 端创建一个监听服务端创建一个监听服务 ServerSocketServerSocket myServermyServer=new ServerSocket(=new ServerSocket(50005000););l 调用调用监听服务的监听服务的accept( )accept( )方法在方法在 Server Server 端创建一个端创建一个SocketSocket对象随时监听可能的对象随时监听可能的 ClientClient端请求端请求 Socket Sock

33、et linkSocketlinkSocket= =myServer.acceptmyServer.accept( );( );l 在在 Server Server 与与 Client Client 之间建立一个连接来传递数据之间建立一个连接来传递数据 OutputStreamOutputStream SocketOsSocketOs= = linkSocket.getOutputStreamlinkSocket.getOutputStream( ); ( ); /用于写数据用于写数据 InputStreamInputStream SocketIsSocketIs= = linkSocket.

34、getInputStreamlinkSocket.getInputStream( ); ( ); /用于读数据用于读数据l 调用监听服务的调用监听服务的close( ) close( ) 方法结束监听服务方法结束监听服务 myServer.closemyServer.close( );( ); Socket 类类p创建一个创建一个 Socket Socket 对象,向服务器发出请求。对象,向服务器发出请求。 Socket myClient=new Socket(“Server 主机名”,端口号);p在在 Server Server 与与 Client Client 之间建立一个连接来传递数据。

35、之间建立一个连接来传递数据。 OutputStreamOutputStream SocketOsSocketOs= = myClient.getOutputStreammyClient.getOutputStream( );/( );/用于写数据用于写数据 InputStreamInputStream SocketIsSocketIs= = myClient.getInputStreammyClient.getInputStream( );/( );/用于读数据用于读数据p通信结束时,关闭连接。通信结束时,关闭连接。 myClient.closemyClient.close( );( );pu

36、blic class Server private static final int SERVER_PORT = 9001; /指定侦听端口 public Server() try ServerSocket ss = new ServerSocket(SERVER_PORT); /创建服务器套接字 System.out.println(服务端已启动,正在等待客户端服务端已启动,正在等待客户端.); Socket s = ss.accept(); /侦听来自客户端的请求 InputStream in = s.getInputStream(); /获得输入流,以接收数据 OutputStream

37、out = s.getOutputStream(); /获得输出流以发送数据 byte buf = new byte1024; int len = in.read(buf); /从输入流中读取数据 String strFromClient = new String(buf, 0, len); System.out.print(来自客户端的信息来自客户端的信息); System.out.println(strFromClient); String strToClient = “你好!你好!; out.write(strToClient.getBytes(); /往输出流中发送数据 in.clos

38、e(); out.close(); /关闭输入流和输出流 s.close(); ss.close(); /关闭通信套接字和服务器套接字 System.out.println(服务端已关闭。服务端已关闭。); catch (IOException ioe) ioe.printStackTrace(); public static void main(String args) new Server(); 示例(服务端)示例(服务端)public class Client private static final int SERVER_PORT = 9001; /服务器的侦听端口 public Cl

39、ient() try /由于服务端也是运行在本机,所以创建本机的InetAddress对象 InetAddress address = InetAddress.getByName(localhost); Socket s = new Socket(address, SERVER_PORT); /向服务器侦听端口发出请求 System.out.println(客户端已启动。客户端已启动。); InputStream in = s.getInputStream(); /获得输入流,用来接收数据 OutputStream out = s.getOutputStream(); /获得输出流,用来发送数

40、据 String strToServer = “Hello; out.write(strToServer.getBytes(); /往输出流中发送数据 byte buf = new byte1024; int len = in.read(buf); /从输入流中读取数据 String strFromServer = new String(buf, 0, len); System.out.print(来自服务端的回答来自服务端的回答); System.out.println(strFromServer); in.close();out.close(); /关闭输入流和输出流 s.close();

41、 /关闭通信套接字 System.out.println(客户端已关闭。客户端已关闭。); catch (UnknownHostException nhe) System.out.println(未找到指定主机未找到指定主机.); catch (IOException ioe) ioe.printStackTrace(); public static void main(String args) new Client(); 示例(客户端)示例(客户端)作业作业编写聊天程序客户端程序客户端程序import java.awt.event.*;import java.io.*;import .*;p

42、ublic class ClientGUI implements ActionListener SocketGUI clientframe;Socket socket;InputStream in;OutputStream out;final int serverPort=5002;public ClientGUI() clientframe = new SocketGUI(客户端客户端);try socket = new Socket(Localhost,serverPort);in=socket.getInputStream();out=socket.getOutputStream();b

43、yte buf=new byte1024;clientframe.tf.addActionListener(this);while(true) int len=in.read(buf); clientframe.ta.append(服务器端说:服务器端说:+new String(buf,0,len)+n); catch (Exception e) e.printStackTrace();finallytry socket.close(); catch (IOException e) e.printStackTrace();接收服务器端发来的信息public void actionPerform

44、ed(ActionEvent arg0) clientframe.ta.append(我说:我说:+clientframe.tf.getText()+n);try out.write(clientframe.tf.getText().getBytes(); catch (IOException e) e.printStackTrace();向服务器端发送信息主方法主方法public static void main(String args) new ClientGUI();文件传送文件传送Java是通过使用流模式来实现网络信息交互的,这种模式下,一个接口同时拥有两个流输入流和输出流。客户端源文

45、件服务器目的文件复制文件示例复制文件示例import java.io.*;class CopyFileDemo public static void main(String args) throws IOException File srcFile = new File(src.dat); /源文件对象 File destFile = new File(dest.dat); /目标文件对象 /使用源文件对象创建文件输入流对象 FileInputStream fis = new FileInputStream(srcFile); /使用目标文件对象创建文件输出流对象 FileOutputStre

46、am fos = new FileOutputStream(destFile); byte buf = new byte1024; /创建字节数组,作为临时缓冲 System.out.println(开始复制文件开始复制文件.); int i; while (i=fis.read(buf)!= -1) /循环从文件输入流中读取数据 fos.write(buf,0,i); /写入到文件输出流中 System.out.println(文件复制成功!文件复制成功!); fis.close(); /关闭流 fos.close(); 关于关于IO流流计算机系统将除了CPU和内存以外其它所有设备都当成文件

47、来处理,包括网络终端(网卡)也不例外;在两台主机之间通过socket建立握手连接之后,主要是通过输入/输出流来接收和发送数据,实际上,对于网络的操作,绝大部分是在操作IO流;实际上操作网络端口流与操作磁盘文件流的原理是相似的;出于效率的考虑,scoket使用的是字节流,但是在实际操作中,字节往往会带来不便,所以我们一般会把字节流改造成字符流后进行操作。输入输入对于InputStream,先使用InputStreamReader转化成字符流;然后再使用BufferedReader建立缓冲,以提高效率,如:InputStream is = socket.getInputStream();Input

48、StreamReader isr = new InputStreamReader(is);BufferedReader in = new BufferedReader(isr);import java.io.*;import java.awt.*;import java.awt.event.*;import .*;public class chatServer extends Frame implements ActionListener Label label=new Label(聊天聊天); Panel panel=new Panel( ); TextField tf=new TextFi

49、eld(10);/用来输入要说的话用来输入要说的话 TextArea ta=new TextArea( );/用来显示聊天过程用来显示聊天过程服务器端:服务器端:基于基于Socket 的的聊天聊天程序程序 ServerSocket server; Socket client; InputStream in; OutputStream out; public chatServer( )/构造方法构造方法 super(服务器服务器); setSize(250,250); panel.add(label); panel.add(tf); tf.addActionListener(this); add

50、(North,panel); add(Center,ta);addWindowListener(new WindowAdapter( ) public void windowCloseing(WindowEvent e) System.exit(0); ); show( ); try server=new ServerSocket(5000); client=server.accept( ); ta.append(已连接的客户机已连接的客户机: +client.getInetAddress( ).getHostName( )+nn); in=client.getInputStream( );

51、out=client.getOutputStream( ); catch(IOException ioe) while(true)/接受客户端说的话接受客户端说的话 try byte buf=new byte256; in.read(buf); String str=new String(buf); ta.append(客户机说:客户机说:+str); ta.append(n); catch(IOException ioe) public void actionPerformed(ActionEvent e) try String str=tf.getText( ); byte buf=str

52、.getBytes( ); tf.setText(null); out.write(buf);/发送服务器说的话发送服务器说的话 ta.append(我说:我说:+str); ta.append(n); catch(IOException ioe) public static void main(String args ) new chatServer( ); import java.io.*;import java.awt.*;import java.awt.event.*;import .*;public class chatClient extends Frame implements

53、ActionListener Label label=new Label(聊天聊天); Panel panel=new Panel( ); TextField tf=new TextField(10); TextArea ta=new TextArea( ); Socket client; InputStream in; OutputStream out;客户端:客户端:基于基于Socket 的的聊天聊天程序程序 public chatClient( )/构造方法构造方法 super(客户机客户机); setSize(250,250); panel.add(label); panel.add(

54、tf); tf.addActionListener(this); add(North,panel); add(Center,ta); addWindowListener(new WindowAdapter( ) public void windowClosing(WindowEvent e) System.exit(0); ); show( ); try client= new Socket(InetAddress.getLocalHost( ),5000); ta.append(已连接到服务器已连接到服务器:+ client.getInetAddress( ).getHostName( )+

55、nn); in=client.getInputStream( ); out=client.getOutputStream( ); catch(IOException ioe) while(true)/接受服务器端说的话接受服务器端说的话 try byte buf=new byte256; in.read(buf); String str=new String(buf); ta.append(服务器说服务器说:+str); ta.append(n); catch(IOException e) public void actionPerformed(ActionEvent e) try Strin

56、g str=tf.getText( ); byte buf=str.getBytes( ); tf.setText(null); out.write(buf); ta.append(我说我说:+str); ta.append(n); catch(IOException ioe) public static void main(String args ) new chatClient( ); 6.多线程的多线程的TCP服务器服务器在典型的服务器中,我们希望同时能处理多个客户的请求。解决这个问题的关键就是多线程处理机制最基本的方法是:在服务器(程序)里创建单个ServerSocket,并调用acc

57、ept()来等候一个新连接。一旦有连接请求到来,便将取得的socket对象传递给线程对象,在线程中执行服务代码。然后再调用accept(),等候下一次新的连接请求。客户端程序使用线程模拟多个客户向服务器请求连接服务。 在一台计算机上一次启动多个服务器程序,只要端口号在一台计算机上一次启动多个服务器程序,只要端口号不同。不同。myserver1 myclient1myserver1 myclient1myserver2myclient2myserver2myclient2Server1(1111)client(2222)Server2(2222)client(1111) Server解决方案一:

58、 解决方案二:解决方案二: 将服务器写成多线程的,主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。while (true) accept a connection ; create a thread to deal with the client ; end while Serverclient1client2serverthread2serverthread1此外此外:服务器应能支持客户间的通信服务器应能支持客户间的通信可以在服务器端将与各客户进行通信的Socket和线程管理起来,从而各客户之间可以在

59、服务器端的协助下进行通信。服务器服务器(4444)acceptsocket客客户户2IP1 client1线程线程1客客户户1IP2 client2线程线程2【例12.6】多线程的TCP服务器程序。服务器端的部分运行结果如图12.3所示。总结总结网络的发展促使计算机之间的通信日趋重要;网络上的计算机通过IP地址来区分不同的机器,端口是数据的通道,使得多个应用程序在同一主机上进行网络通信;InetAddress用来描述主机地址;Socket用来创建两台主机之间的连接;ServerSocket用来侦听来自客户端的请求;我们实际上是通过操作IO流来进行数据的收发工作,将字节流改造成字符流会使操作更加

60、方便。Java Web应用开发应用开发 第四章第四章本章相关词汇本章相关词汇单 词说 明protocol协议HyperText TransferProtocol(HTTP)超文本传输协议content内容split劈开,分离本章目标本章目标使用Socket发送文本文件以及超文本文件了解HTTP协议了解客户端浏览器的基本运行原理了解Web服务器的基本运行原理使用使用Socket发送文件内容发送文件内容在前面的章节中,我们已经基本了解如何使用套接字进行网络通信;我们甚至使用Socket实现了简单的对话聊天功能;那么,我们是不是也可以利用Socket来实现发送文件的功能呢?案例案例1(服务端)(服务

温馨提示

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

评论

0/150

提交评论