版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 网络编程,10.1 URL类的应用 10.2 Socket编程,10.1 URL类的应用,如果回顾Java的发展史和开发目标,那么大概就可能了解这一章的内容在Java里的重要性了。作为网络上的程序语言,能够让使用者通过网络返回各个Applet来执行,还不能算是在网络上生存了,在程序执行时,它还必须要有能力去取用网络上的各种资源及数据,去和服务器建立各种传输管道,将自己的数据散播到网络的各个角落等。这些有关网络方面的功能,都定义在程序包中。 Java语言所提供的网络功能共有以下三大类。 (1)URL:统一资源定位器(Uniform Resource Locator),用于表示Inter
2、net上资源的地址。这里的资源,可以是文件、目录或更为复杂的对象引用。这是三大类功能中最高级的一种。通过URL的网络资源表达方式,很容易就可以确定网络上数据的所在地。利用URL的表示和建立,程序就可以直接读入网络上所放的数据以及传送自己的数据到网络的彼端。,下一页,返回,10.1 URL类的应用,(2)Socket:所谓的Socket可以想象成是两个不同的程序通过网络的沟通管道,而这也是传统上网络程序最常使用的方式。一般在TCP/IP的网络协议下的主从架构软件,通常也使用Socket来作为它们沟通信息的方式。 (3)Datagram:是这些功能中最低级的一种。其他的网络数据传送方式都假想在程序
3、执行时,建立了一条安全稳定的沟通管道,但是以datagram的方式传送数据时,只是把数据的目的地记录在数据包中,就直接放到网络上,系统并不保证数据是否能安全送到,或是什么时候可以送到。 由于Datagram的使用方式比较复杂,而且需要一些传统网络程序设计的基本概念,所以在这一章中只讨论URL和Socket。至于Datagram的相关内容请参考相关的书。,下一页,上一页,返回,10.1 URL类的应用,10.1.1 URL和URL类 1. TCP/IP协议 TCP(Transmission Control Protocol)/IP(Internet Protocol)协议是当前网络数据传输的基础
4、协议。它们可以保证不同厂家生产的计算机能在共同的网络环境下运行,解决异构网通信问题,TCP/IP与低层的数据链路层和物理层无关,能广泛支持由低两层协议构成的物理网络结构。 TCP是面向连接的可靠数据传输协议;TCP重发一切没有收到的数据,进行数据内容准确性检查,并保证数据分组的正确顺序。,下一页,上一页,返回,10.1 URL类的应用,IP协议是面向无连接的数据报通信。它具备数据报路由选择和差错控制功能。IP协议将报文传送到目的主机后,无论传送正确与否都不进行检验,不回送确认,不保证分组的正确顺序。 为实现网络中不同计算机之间的通信,每台机器都必须有一个与众不同的标志,这就是IP地址,TCP/
5、IP使用IP地址来标志源地址和目的地址。IP地址由4组8位的二进制数字组成,组间以圆点隔开,如。 2. URL URL一般由协议名、资源所在的主机名和文件名等部分组成,即: 协议名:/资源名,下一页,上一页,返回,10.1 URL类的应用,协议名指定连接网络并获取资源所用的传输协议,如HTTP,FTP,Gopher,File等。其中最常用的是HTTP(HyperText Transfer Protocol,超文本传输协议)协议和FTP(File Transfer Protocol,文件传输协议)协议。资源名则表示该URL的地址,其格式和使用的协议有关,一般包括以下几个部分
6、。 主机名:资源所在的机器名。 文件名:文件在主机上的全路径名。 端口号:资源所在主机上用于连接该URL的端口(port)号。 引用:它是文件资源中的一个标记,可以以超链接的方式在HTML文件中指定文件的一个部分。 其中,前两个部分是必不可少的,后两部分是可选项。 例如下面的URL: :80/default.html,下一页,上一页,返回,10.1 URL类的应用,从URL可以看出,其所用的协议是http协议,资源所在的主机是,文件名是default.html。有时资源名也可以省略,这样就直接指向主机。此外,还可以包含端口号来指定与远端主机相连接的端口。如果不指定端口则使用默认值,http协议
7、的默认端口号是8080。 3. URL类 为了表示URL,中定义了类URL,URL类的构造函数有很多种,可以通过这些构造函数来初始化一个URL对象。 public URL(String absURL) 通过一个包含完整URL地址的字符串absURL来初始化一个URL对象,例如: URL absURL = new URL(String );,下一页,上一页,返回,10.1 URL类的应用,public URL(String baseURL,String relURLString) 通过一个基URL和一个表示相对URL的字符串来初始化一个URL对象,例如: URL baseURL = new UR
8、L(); URL relURL = new URL(baseURL,index.html); 此构造函数必须包含一个URL对象(称为基URL,如baseURL)作参数,并在此基URL对象的基础上根据提供的相对URL信息,构造一个新的URL对象。如果第一个baseURL的值为null,则程序将第二个相对URL参数作为绝对URL使用。 例子中,先创建了一个指向路径的基URL对象,并在此基础上创建了一个指向基URL中的index.html文件的新URL对象。,下一页,上一页,返回,10.1 URL类的应用,public URL(String protocol,String host,String f
9、ile) 通过代表协议名、主机名和文件路径的3个字符串来初始化一个URL对象,例如: URL SINA = new URL(http,/pages/index.html); 其中,第一个参数代表使用的协议,第二个参数代表网络上的主机名,第三个参数代表该文件在主机上的路径。该定义和下面的语句是等效的。 URL SINA = new URL( 它将创建一个指向 public URL(String protocol,String host,int port,String file),下一页,上一页,返回,10.1 URL类的应用,通过代表协议名、主机名、端口号和文件路径的4个字符串来初始化一个URL
10、对象,例如: URL SINA = new URL(http,80,/pages/index.html); 其中,第一个参数代表使用的协议,第二个参数代表网络上的主机名,第三个参数代表该机器使用的端口号,第四个参数代表该文件在主机上的路径。该定义和下面的语句是等效的。 URL SINA = new URL(:80/pages/index.html); 它将创建一个指向:80/pages/index.html的URL对象。,下一页,上一页,返回,10.1 URL类的应用,注意:如果所构造的URL指向了不存在的文件,或协议名出错,构造函数将抛出一个MalformedURLException对象,因
11、此在构造类URL对象时,都必须采用try/catch结构或throws语句。 异常处理的格式如下: try URL myURL = new URL(); catch(MalformedURLexception e) /异常处理代码 4. URL类中的方法 URL类提供了一些对URL对象进行操作的方法,如表10-1所示。,下一页,上一页,返回,表10-1,返回,10.1 URL类的应用,10.1.2 URL类的应用 1. 通过URL读取WWW信息 创建了一个URL对象后,就可以根据此对象来访问指定的WWW资源,如文本文件或图片资源等。下面通过一个实例,介绍如何使用URL类的openStream(
12、)方法来获取网上的资源。 (1)创建工程。选择File|New Project命令,打开Project Wizard对话框,建立一个工程,输入URLDemo作为名字,设定工程的标题为“URLDemo”,保留其他的默认选项,单击Finish按钮,在主界面可以看到生成一个URLDemo工程。,下一页,上一页,返回,10.1 URL类的应用,(2)创建Java程序。选择File|New命令,打开Application Wizard对话框,创建一个名为URLDemo的应用程序,这时在工程URLDemo中生成两个程序Frame1.java和URLDemo.java。 (3)添加组件。在Frame1.ja
13、va文件的Design视图中,选择XYLayout布局管理器,并依次在设计窗体中添加一个Label组件、一个TextField组件、一个Button组件和一个TextArea组件。 (4)设置各组件的属性。将标签label1的text属性改为“URL:”,并设字体为宋体、15号字;将文本域textField1的text属性改为空,并设字体为宋体、15号字;将按钮button1的label属性改为“读入”,并设字体为宋体、15号字;将textarea1的text属性改为空,并设字体为宋体、15号字。 调整各组件的位置,组件的布局如图10-1所示。,下一页,上一页,返回,图10-1,返回,10.1
14、 URL类的应用,此时系统将自动生成以下代码: public class Frame1 extends JFrame Label label1 = new Label1 (); TextField textField1= new Label1 (); Textrea textArea1 =new TextArea (); Button button1= new Button (); Private void jbInit () throws Exception label1.setFont ( new java.awt.Font (宋体, 0, 15); label1.setText (URL
15、: ); textField1.setFont ( new java.awt.Font (宋体, 0, 15); textField1.setText ( );,下一页,上一页,返回,10.1 URL类的应用,textArea1.setFont ( new java.awt.Font (宋体, 0, 15); textAera1.setText ( ); Button1.setFont ( new java.awt.Font (宋体, 0, 15); Button1.setLabel ( 读入 ); contentpane.add (label1, new XYConstraints(53,
16、32, 50, 27); contentPane.add (textField1, new XYConstraints(98, 36, 181, 29); contentPane.add (Button1, new XYConstraints(295, 33, 67, 40); contentPane.add (textArea1, new XYConstraints(54, 89, 313, 175); ,下一页,上一页,返回,10.1 URL类的应用,(5)添加事件响应代码。在Design视图中,双击Button组件,为组件添加时间监听器,并生成响应事件的代码。返回Source视图,添加实
17、现网络连接,并获取网络资源功能的代码。 实现设定功能的代码如下: import .*; /引入.*包 import java.io.*; /引入java.io.*包 public class Frame1 extends JFrame private void jbInit () throws Exception /添加事件监听器 button1.addActionListener(new Frame1_button1_actionAdapter(this); ,下一页,上一页,返回,10.1 URL类的应用,/事件响应方法,实现网络连接 void button1_actionPerforme
18、d(ActionEvent e) /使用输入流完成数据读入功能 URL url; /声明一个URL对象 try url = new URL(textField1.getText (); String inputline = ; InputStream is = url.openStream (); InputStream bis = new BufferedInputStream(is); /类型转换 /创建读入数据的InputStreamReader对象 InputStreamReader r= new InputSteamReader(bis);,下一页,上一页,返回,10.1 URL类的
19、应用,int c; while( c=r.read ()!= .1) /当读入的数据为.1 时,结束读入 ( inputline +=(char)c; textArea1.setText(intputline); bis.close (); /读入完毕,关闭输入流 catch(MalformedURLException ex1) catch(IOException ex2) ,下一页,上一页,返回,10.1 URL类的应用,需要说明的是,当使用IO流进行数据操作时,很有可能引发IOException类异常;创建URL类对象时,也很可能引发MalformedURLException异常,因此必须
20、进行异常捕捉,否则JBuilder X将提示出错。 此例的基本代码结构如下:首先创建一个用户图形界面,用以显示获取的网络资源信息;然后在事件响应方法中,使用URL类、InputStream类和InputStreamReader类完成同指定的URL建立连接并获取网络资源的任务。其实,InputStream类也可实现数据读入功能,但InputStreamReader类的处理功能更强大。 (6)编译并运行程序URLDemo.java。在URL对应的文本框中键入http:/cn.sports. ,下一页,上一页,返回,图10-2,返回,10.1 URL类的应用,2. URLConnection类的使用
21、 在Java中,获取网络资源的工作也可以通过URLConnection类来实现。URLConnection类是一个抽象类,它代表与URL指定的数据源的动态连接。在网络应用上,URLConnection类能提供比URL类更强的服务器交互控制功能,它可以对HTTP服务器发送的数据进行检查,并可以使用POST或PUT方法将数据发送到Web服务器。 URLConnection类之所以是抽象类,是由它所实现的功能决定的。URLConnection类是Java的网络协议处理机制的一部分,并为网络数据传输提供服务。为实现特定的网络传输协议,需要编写特定的子类,以满足该协议的特殊要求。,下一页,上一页,返回,
22、10.1 URL类的应用,URLConnection类可以通过用户编写的应用程序在运行时加载,其内部定义的很多方法都是受保护的,通常只可以被URLConnection类及其子类访问,用户不能在其代码中直接创建URLConnection类。 通常,URLConnection类的对象是通过URL定义的openConnection ()方法创建的,创建的URLConnection对象可以根据用户实现的类型(HTTP,FTP等)建立与服务器的连接。URLConnection类中定义的connect ()方法可在本地和远程机之间建立一个连接,使用户可以收发数据。而URLConnection类定义的get
23、InputStream ()方法可以读取和分析从服务器发送来的数据。,下一页,上一页,返回,10.1 URL类的应用,下面就以URL类的应用例子为参照,简单介绍URLConnection类的使用方法。在URLDemo工程的基础上,修改button1_actionPerformed ()方法的代码,使用URLConnection类来实现同样的功能。修改后代码如下: void button1_actionPerformed (ActionEvent e) /使用URLConnection类完成网络数据的读取功能 URL url; /定义一个URL对象 try url = new URL(textF
24、ield1.getText (); /用输入的URL为定义的URL对象初始化 URLConnection uc = url.openConnection (); /创建一个URLConnection类对象 String inputline = ;,下一页,上一页,返回,10.1 URL类的应用,InputStream is = uc.getInputStream (); /调用getInputStream ()方法 InputStream bis = new BufferedInputStream (is); Reader r = new InputStreamReader (bis); /创
25、建InputStreamReader对象 int c; while ( c=r.read () !=.1) /当输入的数据为.1时,结束读入 inputline += (char) c; textArea1.setText (inputline); bis.close (); /关闭输入流 catch (MalformedURLException ex1) ,下一页,上一页,返回,10.1 URL类的应用,catch (IOException ex2) 从此例的简单输入流来看,URL和URLConnection的用法基本相同。事实上,两者间最大的区别在于,URLConnection类提供了对M
26、IME首部的访问及对HTTP的响应;URLConnection可运行用户配置发向服务器的请求参数;URLConnection可以获取从服务器发来的数据,同时也可以向服务器发送数据。参考代码如下: try URL url = new URL ( ); URLConnection uc = url.openConnection (); uc.setDoOutput (true); /调用setDoOutput(true)来打开输入流设置,下一页,上一页,返回,10.1 URL类的应用,OutputStream os = uc.getOutputStream (); /创建OutputStream类
27、对象 /定义OutputStream Wirter类对象 OutputStream bos = new BufferedOutputStream (os); OutputStreamWriter out = new OutputStreamWriter (bos,8859.1); out.write (This is a Output Example!); /调用OutputStreamWriter的方法write() out.flush (); out.close (); /关闭输入流 catch (MalformedURLException ex1) catch (IOException
28、ex2) ,下一页,上一页,返回,10.1 URL类的应用,在默认的情况下,URLConnection不能输出,所以必须在请求输出流之前调用setDoOutput ()方法,把DoOutput属性设为true,请求模式就由GET变成POST,这时就可以创建输出流来完成发送数据的任务。,上一页,返回,10.2 Socket编程,10.2.1 Java的网络编程基础 Socket 是指在一个特定编程模型下进程间通信链路的端点。因为这个特定编程模型的流行,Socket 这个名字在其他领域得到了复用,包括Java技术。当进程通过网络进行通信时,Java 技术使用它的流模型。一个Socket 包括两个流
29、:一个输入流和一个输出流。如果一个进程要通过网络向另一个进程发送数据,只需简单地写入与Socket相关联的输出流,而一个进程通过与Socket相关联的输入流来读取另一个进程所写的数据。建立网络连接之后,使用与Socket相关联的流和使用其他流是非常相似的。,下一页,返回,10.2 Socket编程,当我们打电话的时候,必须知道对方的电话号码。同样,如果要建立网络连接,也必须知道远程机器的地址或名字,此外,每个网络连接需要一个端口号,可以把它想象成电话的分机号码。一旦和一台计算机建立连接,需要指明连接的目的。所以,就如同我们可以使用一个特定的分机号码来和其他部门对话那样,也可以使用一个特定的端口
30、号来使一个程序和另一个程序通信。 TCP/IP 系统中的端口号是一个16位的数字,它的范围是065535。实际上,小于1024的端口号保留给预定义的服务,而且除非要和那些服务之一进行通信(例如Telnet,SMTP邮件和FTP等),否则不应该使用它们。当要通信时,客户端和服务器端必须事先约定所使用的端口,如果系统两部分所使用的端口不一致,那就不能进行通信。,下一页,上一页,返回,10.2 Socket编程,在 Java 编程语言中,TCP/IP Socket 连接是用 包中的类实现的。 通信的基本过程如下: (1)服务器分配一个端口号。如果客户请求一个连接,服务器使用 accept()方法打开
31、 socket连接。 (2)客户在 host的port 端口建立连接。 (3)服务器和客户使用InputStream 和 OutputStream 进行通信。,下一页,上一页,返回,10.2 Socket编程,10.2.2 Socket类和ServerSocket类 Socket类和ServerSocket类是Java语言提供的两个实现Socket连接功能的类。其中,Socket类用来编写客户端的程序,它提供了实现连接的Socket通道;ServerSocket类则用于编写服务器端程序,它由Socket连接的服务器端实现。 Java开发包中的各个程序随应用平台的变化而有所不同,它们会提供建立网
32、络连接中一些与具体平台相关的底层细节,但程序设计人员不需要考虑这些问题,可以直接使用Socket类和ServerSocket类中提供的方法来编写网络程序,所开发出来的Java程序都具有平台无关性,可实现跨平台的操作。 Socket类常用的方法如表10-2所示。,下一页,上一页,返回,表10-2,返回,10.2 Socket编程,ServerSocket类的常用方法如表10-3所示。 其中,address,host和port分别表示连接中一方的IP地址、主机名和端口号;stream指明Socket是Socket流还是Socket数据报;localPort表示本地主机的端口号;locaAddr和b
33、indAddr是本地机器的地址(ServerSocket的主机地址)。 在服务器方,通过生成一个ServerSocket对象来打开一个Socket,然后自动调用accept()方法来准备随时接受来访的请求。Accept()方法是阻塞性的方法,所谓阻塞性方法就是指该方法被调用后,将等待客户端的请求,直到有一个客户端请求连接到相同的端口,然后accept()方法才返回并创建一个对应于客户的Socket。这时,客户端和服务器端建立了对应的Socket,双方的Socket分别打开各自的输入/输出流进行通信。,下一页,上一页,返回,表10-3,返回,10.2 Socket编程,类Socket提供了方法g
34、etInputStream()和getOutputStream()来得到对应的输入/输出流,以进行读/写操作,这两个方法分别返回InputStream和OutputStream类对象。当然可在返回的输入/输出流对象上建立过滤流,如DataInputStream,DataOutputStream或BufferedInputStream,BufferedOutputStream等。对于文本方式流对象,可使用InputStreamReader,OutputStreamWriter或 PrintWriter等类进行处理。 每个Socket都占用了一定的资源,因此在使用完毕后,必须将其关闭。使用Sock
35、et的close()方法完成关闭任务。在关闭Socket前,应先关闭所有的输入/输出流对象,以释放所有占用的资源。,下一页,上一页,返回,10.2 Socket编程,10.2.3 Client/Server 1. 使用Socket通信的服务器端(Server)程序 本实例中,将使用Socket来构建客户端和服务器端的通信连接,本小节将实现一个客户机/服务器应用程序的服务器端程序,它将和在下一节中实现的客户端程序同时使用,共同完成Client/Server的通信。 (1)创建工程。选择File|New Project命令,打开Project Wizard对话框,创建一个名为ServerDemo的
36、工程。 (2)创建Java文件。选择File|New命令,打开Application Wizard对话框,创建一个名为ServerDemo的应用程序,并将Title设为“服务器端”。这时在工程ServerDemo中将生成两个程序Framel.java和ServerDemo.java。,下一页,上一页,返回,10.2 Socket编程,(3)添加组件。在Framel.java文件的Design视图中,选择XYLayout布局管理器,并依次在设计窗体中添加一个TextArea组件、一个Label组件、一个TextField组件和两个Button组件,并得到如图10-3所示的布局图。 (4)设置各组
37、件的属性。对各组件属性的改动如下:将textareal的text属性改成空,并设字体为宋体、15号字;将labell的text属性设为“发送信息:”,并设字体为宋体、15号字;将文本域 textField1的text属性设为空,并设字体设为宋体、15号字;将按钮button1的label的属性改为“发送”,name属性改为“sendl”,并将字体设为宋体、15号字;将按钮button2的label属性改为“退出”,name属性改为“exitl”,并将字体设为宋体,15号字;最好调整各组件的位置和大小。,下一页,上一页,返回,图10-3,返回,10.2 Socket编程,此时,系统将生成如下的代
38、码: public class Frame1 extends JFrame XYLayout xYLayout1 = new XYLayout(); TextArea textArea1 = new TextArea(); Label label1 = new label(); TextField textfiled1 = new TextField(); Button button1 = new Button(); Button button2 = new Button(); private void jbInit() throws Exception contentPane.setLayo
39、ut(xYLayout1);,下一页,上一页,返回,10.2 Socket编程,textArea1.setFont(new java.awt.Font(宋体, 0, 13); textArea1.setText(); label1.setFont(new java.awt.Font(宋体, 0, 13); label1.setText(发送信息:); textField1.setFont(new java.awt.Font(宋体, 0, 13); textField1.setText(); button1.setFont(new java.awt.Font(宋体, 0, 13); button
40、1.setLabel(发送); button2.setFont(new java.awt.Font(宋体, 0, 13); button2.setLabel(退出); contentPane.add(textArea1, new XYConstraints(39, 22, 329, 161);,下一页,上一页,返回,10.2 Socket编程,contentPane.add(label1, new XYConstraints(43, 201, 71, 28); contentpane.add(textField1, new XYConstraints(130, 203, 248, 31); c
41、ontentPane.add(button2, new XYConstraints(295, 250, 72, .1); contentPane.add(button1, new XYConstraints(40, 249, 70, 32); (5)添加响应事件,在Design视图中,双击sendl组件和exitl组件,系统将为组件添加事件监听代码和事件响应代码。返回Source视图,在 sendl_actionPerformed()方法和exitl_action Performed() 方法中直接添加完成 Socket通信功能的代码;返回Design视图,打开textFieldl组件的事件栏
42、(Events),双击keyPerssed选项,系统将添加响应事件的textFieldl_keyPressed()方法,可在其中添加处理文本信息的代码。,下一页,上一页,返回,10.2 Socket编程,添加的代码如下: import .*; import java.io.*; public class Frame1 extends JFrame implements Runnable /声明ServerSocket和Socket对象,以实现Socket连接 ServerSocket server = null; Socket socket = null; BufferedReader in
43、= null; PrintWriter out = null; /重写Runnable中的run ()方法,以实现建立连接的功能,下一页,上一页,返回,10.2 Socket编程,public void run () try /创建一个指定端口的ServerSocket对象 try server = new ServerSocket (4700); catch (Exception e) /监听客户端的来访请求,并创建一个Socket对象 try socket = server.accept (); catch (Exception e) /调用Socket的getInputStream ()
44、和getOutputStream ()方法,创建输入和输出流,下一页,上一页,返回,10.2 Socket编程,in = new BufferedReader (new InputStreamReader(socket.getInputStream(); out = new PrintWriter (socket.getOutputStream (); if(socket !=null) /显示连接成功信息和端口信息 textArea1.append (系统信息:客户端已连接!n); textArea1.append(系统信息:使用端口 + String.valueOf(socket.getL
45、ocalPort() +n); send1.seEnabled (true); ,下一页,上一页,返回,10.2 Socket编程,/创建receiver类对象r receiver r = new receiver (); /为receiver对象建立一个线程 Thread t = new Thread (r); t.start (); catch (IOException ex1) textArea1.append(系统出错:+ex1.toString() + n); /创建一个类receiver,它继承Runnable接口,以接收Client端发送来的信息,下一页,上一页,返回,10.2
46、Socket编程,public void run () String s1 = null; try /从输入流中读入信息 s1 = in.readLine (); /如果输入信息为exit,则结束Socket通信 while (s1 != exit) textArea1.append (信息来自客户端:+ s1 + n; s1 = in.readLine (); ,下一页,上一页,返回,10.2 Socket编程,/依次关闭输入流、输出流、Socket类对象和ServerSocket类对象 in.close (); out.close (); socket.close (); server.c
47、lose (); catch (IOException ex2) textArea1.append(系统出错: + ex2.toString() + n); send1.setEndabled(false); ,下一页,上一页,返回,10.2 Socket编程,private void jbInit () throws Exception /为组件添加监视代码 textField1.addKeyListener (new Frame1_textField1_keyAdapter (this); send1.addActionListener (new Frame1_send1_ActionAd
48、apter (this); exit1.addActionListener (new Frame1_exit1_ActionAdpter (this); run (); /执行run () 方法,尝试建立连接 /添加send1组件的事件响应代码 void send1_actionPerformed (ActionEvent e) /在输入流中加入将发送到client端的信息 out.write (textField1.getText() + n);,下一页,上一页,返回,10.2 Socket编程,/清空输出流中的所有信息 out.flush (); /向Server的显示文本中添加信息 te
49、xtArea1.append(信息来服务器: + textField1.getText () + n); /将Server刚发送的信息从文本框中清除 textField1.setText (); /添加exit1组件的事件响应代码 void exit1_actionPerformed ( ActionEvent e) try out.println (欢迎再来!); out.flush (); ,下一页,上一页,返回,10.2 Socket编程,catch(Exception ex3) textArea1.append (系统出错: + ex3.toString () + n); finall
50、y /关闭窗口 System.exit(0); /添加textField组件的键盘事件响应代码,下一页,上一页,返回,10.2 Socket编程,void textField1_keyPressed(KeyEvent e) /键入Enter键,则发送信息 int j = e.getKeyCode (); if (j = e.VK_ENTER) /将信息发送给client端 out.write ( textField1.getText () + n); /将缓存区中的所有信息发出 out.flush (); /在服务器端显示信息,下一页,上一页,返回,10.2 Socket编程,textArea
51、1.append(信息来自服务器: + textField1.getText () + n);图10-4 服务器端的运行结果 textField1.setText (); (6)运行程序。完成代码并保存,编译并运行程序ServerDemo.java。此时,服务器端开始等待用户端的连接请求。当客户端建立连接后,可在文本框中键入要发送的信息,并单击发送按钮或按下键盘的Enter键。同时,服务器端也可接收从客户端发来的信息和系统信息,服务器端的运行结果如图10-4所示。,下一页,上一页,返回,图10-4,返回,10.2 Socket编程,2. 使用Socket通信的客户端(Client)程序 (1)
52、创建工程。选择File | New Project命令,打开Project Wizard对话框,创建一个名为ClientDemo的工程。 (2)创建Java程序。选择File|New命令,打开Application Wizard对话框,创建一个名为ClientDemo的应用程序,并将Title设为“客户端”。这时在工程ClientDemo中将生成两个程序Framel.java和ClientDemo.java。 (3)添加组件。在Framel.java文件的Design视图中,选择XYLayout布局管理器,并依次在设计窗体中添加一个TextArea组件、一个Label组件、两个TextFiel
53、d组件和三个Button组件。,下一页,上一页,返回,10.2 Socket编程,(4)设置各组件属性。对各组件属性的改动如下:将textareal的text属性改成空,并设字体为宋体、15号字;将labell的text属性设为“发送信息:”,并设字体为宋体、15号字;将文本域 textField1和textField2的text属性设为空,并将字体设为宋体、15号字;将按钮button1的label的属性改为“发送”,name属性改为“sendl”,并将字体设为宋体、15号字;将按钮button2的label属性改为“连接”,name属性改为“link1”,并将字体设为宋体、15号字;将按钮
54、button3的label属性改为“退出”,name属性改为“exit1”,并将字体设为宋体、15号字;最后调整各组件的位置和大小,并得到如图10-5所示的布局图。,下一页,上一页,返回,图10-5,返回,10.2 Socket编程,此时,系统将生成如下的代码: public class Frame1 extends JFrame Jpanel contentPane; XYLayout xYLyout1 = new XYLayout(); Label label1 = new Label(); textField textField1 = new TextField(); Button bu
55、tton1 = new Button(); TextArea textArea1 = new TextArea(); Button buton2 = new Button(); TextField textField2 = new TextField(); Button button3 = new Button();,下一页,上一页,返回,10.2 Socket编程,private void jbInit() throws Exception contentPane = (JPanel) this.getContentPane(); label1.setFont(new java.awt.Fo
56、nt(宋体, 0, 15); label1.setText(发送消息:); contentPane.setLayout(xYLayout1); this.setSize(new Dimension(400, 300); this.setTitle(客户端); textField1.setFont(new java.awt.Font(宋体, 0, 15); textField1.setText(); button1.setFont(new java.awt.Font(宋体, 0, 15); button1.setLabel(发送);,下一页,上一页,返回,10.2 Socket编程,button
57、2.setFont(new java.awt.Font(宋体, 0, 15); button2.setLabel(连接); textField2.setText(); button3.setFont(new java.awt.Font(宋体, 0, 15); button3.setLabel(退出); contentPane.add(label1, new XYCconstraints(15, 25, 101, 27); contentPane.add(textField1, new XYConstraints(90, 24, 195, 31); contentPane.add(button1
58、, new XYContraints(299, 28, 86, 28); contentPane.add(textArea1, new XYConstraints(16, 57, 369, 170);,下一页,上一页,返回,10.2 Socket编程,contentPane.add(button2, new XYConstraints(13, 241, 81, 28); contentPane.add(textField2, new XYConstraints(104, 240, 178, 34); contentPane.add(button3, new XYConstraints(298, 242, 81, 28); ,下一页,上一页,返回,10.2 Socket编程,(5)添加响应事件。在Design视图中,双击sendl组件、link1组件和exitl组件,系统将为组件添加事件监听代码和事件响应代码。返回Source视图,在 sendl_actionPerformed()方法、linkl_actionPerformed()方法和exitl_action Performed()方法中直接添加完成 Socket通信功能的代码;返回Design视图,打开textFieldl组件的事件栏(Events),双击keyPressed选项,系统将添
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年建筑市政基础模拟试题及参考答案
- 2026年泰州科目一模拟试题及答案
- 体育训练基地配套设施建设方案
- 摔跤柔道训练基地项目可行性研究报告
- 建筑工程防火封堵专项施工方案
- 2026年再生障碍性贫血三系减少模拟试题及答案
- 2026年噎食患者护理模拟试题及答案
- 2026年服装辨色模拟试卷带答案
- 2026年值班考核模拟试题结构及答案
- 2026年侵蚀性葡萄胎模拟试题及参考答案
- 2026年精神卫生医疗质量控制体系构建与实践
- 2026国家电投集团二级单位总会计师选聘笔试历年参考题库附带答案详解
- DB34T5412-2026护理科普教育服务规范
- 应急维修动力照明火灾自动报警施工方案
- 雨课堂学堂在线学堂云《药物非临床研究的思路和方法(中国药科大学 )》单元测试考核答案
- 江淮十校2026届高三第二次联考英语试卷(含答案详解)
- 《国际商务英语综合教程(第四版)》全套教学课件
- 2025年山东职业病诊断医师考试职业性放射性疾病综合训练题库及答案
- 中石化存货管理制度
- 数字智慧方案5299丨华为业务变革框架及战略级项目管理
- 上海奉贤区区属国有企业招聘笔试题库2025
评论
0/150
提交评论