任务十实现网络聊天ppt课件.pptx
在此输入您的封面副标题任务十 实现网络聊天项目四 模拟聊天室任务十 实现网络聊天目录二任务描述 三技术概览四相关知识 五任务实施六任务小结一学习目标Java程序设计项目化教程项目功能这是一个简单的局域网聊天系统,目的是通过本项目的设计与实现过程,使读者掌握图形界面设计的基本方法,了解熟悉网络编程的基本概念,掌握套接字编程的基本方法,了解线程的基本概念,掌握线程创建和同步处理方法。模拟聊天室分为两个部分:服务器端应用程序和客户端程序。1服务器端应用程序要实现局域网聊天,首先需要设定服务器的人数上限和端口号,启动服务器,服务器负责监听并接收客户的请求,客户和服务器之间可以相互发送信息,客户之间也可以互相发送信息,但客户之间传递信息要先发送给服务器,再由服务器发送给接收方。2客户端应用程序客户端要进入聊天系统,首先要连接服务器,通过登录窗口输入用户昵称和服务器IP地址、端口号。如果服务器已启动,则该客户允许进入聊天系统;客户进入聊天系统后,可以向服务器和其他客户发送信息,也可以接收服务器和其他客户的信息;也可以给所有客户发送信息。服务器端以端口号进行区分,一个端口就是一个聊天室或讨论组,规模以服务器设定的最大人数上限为限,可以创建多个聊天室或讨论组;客户端以用户昵称和服务器IP地址、端口号来连接服务器,以实现加入不同的聊天室或讨论组,可以创建多个客户端。Java程序设计项目化教程学习目标技能目标: 1能正确使用线程进行程序设计。 2能熟练进行UDP网络编程。 3能熟练进行TCP网络编程。知识目标: 1掌握线程与进程的区别与联系。 2掌握线程的创建方式。 3掌握常见的网络类InetAddress类和URL类。 4掌握UDP网络编程的实现。 5掌握TCP网络编程的实现。Java程序设计项目化教程任务描述聊天室的服务器端与客户端的数据发送与接收操作需要通过局域网才能完成,另外,服务器端与客户端的数据收发是同时完成的,如果仅仅使用前面学习的知识是无法实现的。本任务通过对线程、进程、常用网络类、UDP网络编程、TCP网络编程的讲解,来实现聊天室服务器端与客户端之间的网络通信。Java程序设计项目化教程技术概览线程是一个单独程序流程,是程序运行的基本单位。多线程是指一个程序可以同时运行多个任务,每个任务由一个单独的线程来完成。也就是说,多个线程可以同时在一个程序中运行,并且每一个线程完成不同的任务。Java中线程的实现通常有两种方法:派生Thread类和实现Runnable接口。网络编程是指编写运行在多个设备(计算机、移动终端)的程序,这些设备都通过网络连接起来。网络编程的目的就是直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。Java包中的API包含有类和接口,它们提供低层次的通信细节。读者可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。Java包中提供了两种常见的网络协议的支持:TCP:TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称TCP/IP。UDP:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。相关知识Java程序设计项目化教程线程概述传统的程序设计语言同一时刻只能执行单任务操作,效率非常低,如果网络程序在接收数据时发生阻塞,只能等到程序接收数据之后才能继续运行。随着 Internet 的飞速发展,这种单任务运行的状况越来越不被接受。如果网络接收数据阻塞,后台服务程序就会一直处于等待状态而不能继续任何操作。这种阻塞情况经常发生,这时的 CPU 资源完全处于闲置状态。多线程实现后台服务程序可以同时处理多个任务,并不发生阻塞现象。多线程是Java 语言的一个很重要的特征。多线程程序设计最大的特点就是能够提高程序执行效率和处理速度。Java 程序可同时并行运行多个相对独立的线程。例如创建一个线程来接收数据,另一个线程发送数据,即使发送线程在接收数据时被阻塞,接受数据线程仍然可以运行。Java程序设计项目化教程线程概述一、进程在一个操作系统中,每个独立执行的程序都可称为一个进程,也就是“正在运行的程序”。目前大部分计算机上安装的都是多任务操作系统,即能够同时执行多个应用程序,最常见的有Windows、Linux、UNIX等。我们在Windows操作系统下,在任务栏上单击鼠标右键,选择【任务管理器】选项可以打开任务管理器面板,在窗口的【进程】选项卡中可以看到当前正在运行的程序,也就是系统所有的进程,如eclipse.ext、QQ.exe*32、Maxthon.exe*32等。在多任务操作系统中,表面上看是支持进程并发执行的,例如可以一边听音乐一边聊天。但实际上这些进程并不是同时运行的。在计算机中,所有的应用程序都是由CPU执行的,对于一个CPU而言,在某个时间点只能运行一个程序,也就是说只能执行一个进程。操作系统会为每一个进程分配一段有限的CPU使用时间,CPU在这段时间中执行某个进程,然后会在下一段时间切换到另一个进程中去执行。由于CPU运行速度很快,能在极短的时间内在不同的进程之间进行切换,所以给人以同时执行多个程序的感觉。Java程序设计项目化教程线程概述二、线程我们知道,每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,被称为线程。线程(Thread)是控制线程(ThreadofControl)的缩写,它是具有一定顺序的指令序列(即所编写的程序代码)、存放方法中定义局部变量的栈和一些共享数据。线程是相互独立的,每个方法的局部变量和其他线程的局部变量是分开的,因此,任何线程都不能访问除自身之外的其他线程的局部变量。如果两个线程同时访问同一个方法,那每个线程将各自得到此方法的一个拷贝。由于实现了多线程技术,Java显得更健壮。操作系统中的每一个进程中都至少存在一个线程。当一个Java程序启动时,就会产生一个进程,该进程会默认创建一个线程,在这个线程上会运行main()方法中的代码。Java程序设计项目化教程线程概述多线程带来的好处是更好的交互性能和实时控制性能。多线程是强大而灵巧的编程工具,但要用好它却不是件容易的事。在多线程编程中,每个线程都通过代码实现线程的行为,并将数据供给代码操作。代码和数据有时是相当独立的,可分别向线程提供。多个线程可以同时处理同一代码和同一数据,不同的线程也可以处理各自不同的代码和数据。多线程看似是同时执行的,其实不然,它们和进程一样,也是由CPU轮流执行的,只不过CPU运行速度很快,故而给人同时执行的感觉。Java程序设计项目化教程线程的创建Java提供了两种多线程实现方式,一种是继承java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码;另一种是实现接口,同样是在run()方法中实现运行在线程上的代码。下面我们分别讲解,并比较它们的优缺点。一、继承Thread类创建多线程前面的程序都是声明一个公共类,并在类内实现一个 main 方法。事实上,前面这些程序就是一个单线程程序。当它执行完 main 方法的程序后,线程正好退出,程序同时结束运行。请查看教材文件10-1。 案例代码Java程序设计项目化教程类是一个通用的线程类,由于默认情况下run方法是空的,直接通过Thread类实例化的线程对象不能完成任何事,所以可以通过派生Thread类,并用具体程序代码覆盖Thread类中的run方法,实现具有各种不同功能的线程类。在程序中创建新的线程的方法之一是继承Thread类,并通过Thread子类声明线程对象。线程的创建请查看教材文件10-2。 案例代码Java程序设计项目化教程通常创建一个线程的步骤如下。 (1)创建一个新的线程类,继承 Thread 类并覆盖 Thread 类的 run() 方法。 class ThreadType extends Thread public void run() (2)创建一个线程类的对象,创建方法与一般对象的创建相同,使用关键字 new 完成。 ThreadType tt = new ThreadType(); (3)启动新线程对象,调用 start()方法。 tt.start(); (4)线程自己调用 run() 方法。 void run();线程的创建Java程序设计项目化教程请查看教材文件10-3。 案例代码线程的创建Java程序设计项目化教程二、实现Runnable接口创建多线程通过实现Runnable接口的方法是创建线程类的第二种方法。Java中只支持单继承,一个类一旦继承了某个父类就无法再继承Thread类,比如,学生类Student继承了Person类,就无法通过继承Thread类创建线程。利用实现Runnable接口来创建线程的方法可以解决Java语言不支持的多重继承问题。Runnable接口提供了run()方法的原型,因此创建新的线程类时,只要实现此接口,即只要特定的程序代码实现Runnable接口中的run()方法,就可完成新线程类的运行。线程的创建请查看教材文件10-4。 案例代码Java程序设计项目化教程通常实现Runnable 线程的步骤如下。 (1)创建一个实现 Runnable 接口的类,并且在这个类中重写 run 方法。 class ThreadType implements Runnable public void run() (2)使用关键字 new 新建一个 ThreadType 的实例。 Runnable rb = new ThreadType ();(3)通过Runnable 的实例创建一个线程对象,在创建线程对象时,调用的构造函数是new Thread(ThreadType),它用 ThreadType 中实现的 run() 方法作为新线程对象的 run() 方法。 Thread td = new Thread(rb); (4)通过调用 ThreadType 对象的 start()方法启动线程运行。 td.start(); 线程的创建Java程序设计项目化教程请查看教材文件10-5。 案例代码线程的创建Java程序设计项目化教程实现Runnable接口相对于继承Thread类来说,有如下显著的好处:1适合多个相同程序代码的线程去处理同一个资源的情况,把线程同程序代码、数据有效的分离,很好地体现了面向对象的设计思想。2可以避免由于Java的单继承带来的局限性。在开发中经常碰到这样一种情况,就是使用一个已经继承了某一个类的子类创建线程,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式。事实上,大部分的应用程序都会采用第二种方式来创建多线程,即实现Runnable接口。线程的创建Java程序设计项目化教程Java是伴随Internet发展起来的一种网络编程语言。Java专门为网络通信提供了软件包,为当前最常用的TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)网络协议提供了相应的类,使用户能够方便地编写出基于这两个协议的网络通信程序。一、网络协议虽然通过计算机网络可以使多台计算机实现连接,但是位于同一个网络中的计算机在进行连接和通信时必须要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/英特网互联协议)、UDP协议(User Datagram Protocol,用户数据报协议)、ICMP协议(Internet Control Message Protocol,Internet 控制报文协议)和其他一些协议的协议组。网络编程技术基础Java程序设计项目化教程本任务中所学的网络编程知识,主要就是基于TCP/IP协议中的内容。在学习具体的内容之前,首先来了解一下TCP/IP 协议。TCP/IP(又称TCP/IP协议簇)是一组用于实现网络互连的通信协议,其名称来源于该协议簇中两个重要的协议(TCP协议和IP协议)。基于TCP/IP的参考模型将协议分成四个层次。网络编程技术基础Java程序设计项目化教程TCP/IP协议中的四层分别是链路层、网络层、传输层和应用层,每层分别负责不同的通信功能,接下来针对这四层进行详细的讲解。链路层:也称为网络接口层,该层负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议与TCP/IP的网络互联层进行连接。网络层:也称网络互联层,是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP(Transmission Control Protocol)协议,也可以采用UDP(User Datagram Protocol)协议。应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。网络编程技术基础Java程序设计项目化教程本任务所需的网络编程,主要涉及的是传输层的TCP、UDP协议和网络层的IP协议。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输,例如视频会议使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。网络编程技术基础Java程序设计项目化教程TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务器端发出连接请求,每次连接的创建都需要经过“三次握手”。第一次握手,客户端向服务器端发出连接请求,等待服务器确认;第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求;第三次握手,客户端再次向服务器端发送确认信息,确认连接。网络编程技术基础Java程序设计项目化教程由于TCP协议的面向连接特性,它可以保证传输数据的安全性,所以是一个被广泛采用的协议,例如在下载文件时,如果数据接收不完整,将会导致文件数据丢失而不能被打开,因此,下载文件时必须采用TCP协议。二、IP和端口号要想使网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接收数据的计算机或者发送数据的计算机。在TCP/IP协议中,这个标识号就是IP地址,它可以唯一标识一台计算机。目前,IP地址广泛使用的版本是IPv4,它由4个字节大小的二进制数来表示,如:。由于二进制形式表示的IP地址非常不便记忆和处理,因此通常会将IP地址写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号“.”分开,如 “10.0.0.1”。随着计算机网络规模的不断扩大,对IP地址的需求也越来越多,IPv4这种用4个字节表示的IP地址将面临使用枯竭的局面。为解决此问题,IPv6 便应运而生。IPv6使用16个字节表示IP地址,它所拥有的地址容量约是IPv4的81028倍,达到2128个(算上全零的),这样就解决了网络地址资源数量不足的问题。网络编程技术基础Java程序设计项目化教程IP地址由两部分组成,即“网络.主机”的形式,其中网络部分表示其属于互联网的哪一个网络,是网络的地址编码,主机部分表示其属于该网络中的哪一台主机,是网络中一个主机的地址编码,二者是主从关系。IP地址总共分为5类,常用的有3类,介绍如下。A类地址:由第一段的网络地址和其余三段的主机地址组成,范围是到B类地址:由前两段的网络地址和其余两段的主机地址组成,范围是到C类地址:由前三段的网络地址和最后一段的主机地址组成,范围是到另外,还有一个回送地址,指本机地址,该地址一般用来测试使用,例如:ping 127.0.0.1 来测试本机TCP/IP是否正常。网络编程技术基础Java程序设计项目化教程通过IP地址可以连接到指定计算机,但如果想访问目标计算机中的某个应用程序,还需要指定端口号。在计算机中,不同的应用程序是通过端口号区分的。端口号是用两个字节(16位的二进制数)表示的,它的取值范围是065535,其中,01023之间的端口号由操作系统的网络服务所占用,用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用。接下来通过一个图例来描述IP地址和端口号的作用。网络编程技术基础Java程序设计项目化教程三、统一资源定位(URL)统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址。超文本链路由统一资源定位符URL维持。URL的格式是: :/其中:Method是传输协议:HOSTNAME是文档和服务器所在的Internet主机名(域名系统中DNS中的点地址);PORT是服务端口号(可省略);PATH是路径名,FILE是文件名。例如: http:/ client)”或“瘦服务器(thin server)”结构。客户程序(前台程序)在客户机上运行,数据库服务程序(后台程序)在应用服务器上运行。2B/S模式:B/S(Browser/Server,浏览器/服务器)方式的网络结构,客户端统一采用浏览器如:Netscape和IE,通过Web浏览器向Web服务器提出请求,由Web服务器对数据库进行操作,并将结果传回客户端。B/S结构简化了客户机的工作,但服务器将担负更多的工作,对数据库的访问和应用程序的执行都将在这里完成。即当浏览器发出请求后,其数据请求、加工、返回结果、动态网页生成等工作全部由Web服务器完成。网络编程技术基础Java程序设计项目化教程总结:C/S适用于专人使用,安全性要求较高的系统;B/S适用于交互性比较频繁的场合,容易被人们所接受,倍受用户和软件开发者的青睐;B/S模式下的动态网页技术主要有CGI,ASP,PHP,JSP等,其中JSP基于java技术,跨平台性好,“一次编写,到处运行”,并且编写容易,程序员可以快速上手;其重用性好,连接数据库使用JDBC驱动,支持大多数的数据库系统,目前已成为开发B/S系统的主流技术。网络编程技术基础Java程序设计项目化教程包中提供了常用的网络功能类:InetAddress、URL、Socket、Datagram。其中InetAddress面向的是网络层(IP层),用于标识网络上的硬件资源。URL面向的是应用层,通过URL,Java程序可以直接送出或读入网络上的数据。Socket和Datagram面向的则是传输层。Socket使用的是TCP协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通道进行通信。Datagram则使用UDP协议,是另一种网络传输方式,它把数据的目的地记录在数据包中,然后直接放在网络上。本任务我们主要介绍InetAddress和URL类。Java常用网络类Java程序设计项目化教程一、InetAddress类在JDK中,提供了一个与IP地址相关的InetAddress类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法。public static InetAddress getByName(String s):获得一个InetAddress 类的对象,该对象中含有主机的IP地址和域名,该对象用如下格式表示它包含的信息:;public static InetAddress getLocalHost():获得一个InetAddress对象,该对象含有本地机的域名和IP地址;public String getHostName():获取一个字符串,该字符串中含有InetAddress对象的域名;public String getHostAddress():获取一个字符串,该字符串冲含有InetAddress对象的IP地址;public static InetAddress getAllByName(String host):获取InetAddress类的数组对象,该对象中包含本机的所有IP地址;public byte getAddress():获得一个字节数组,其中包含了InetAddress对象的IP地址。其中,前两个方法用于获得该类的实例对象,第一个方法用于获得表示指定主机的InetAddress对象,第二个方法用于获得表示本地的InetAddress对象。通过InetAddress对象便可获取指定主机名,IP地址等。Java常用网络类Java程序设计项目化教程请查看教材文件10-6。 案例代码Java常用网络类Java程序设计项目化教程二、URL类和URLConnection类在JAVA中,J包里面的类是进行网络编程的,其中类和类使编程者方便地利用URL在Internet上进行网络通信。1创建URL对象URL类有多种形式的构造函数:(1)URL ( String url)url代表一个绝对地址,URL对象直接指向这个资源,如:URL urll=new URL(http:/);(2)URL ( URL baseURL , String relativeURL)其中,baseURL代表绝对地址,relativeURL代表相对地址。如:URL urll=new URL(http:/);URL lib=new URL(urll , library / library.asp);(3)URL (String protocol , String host , String file)其中,protocol代表通信协议,host代表主机名,file代表文件名。如:new URL (http , , / test / test.asp);(4)URL ( String protocol , String host , int port , String file)URL lib = new URL (http , , 80 , / test / test.asp);Java常用网络类Java程序设计项目化教程2获取URL对象的属性getDefaultPort(): 返回默认的端口号。getFile(): 获得URL指定资源的完整文件名。getHost(): 返回主机名。getPath(): 返回指定资源的文件目录和文件名。getPort(): 返回端口号,默认为-1。getProtocol(): 返回表示URL中协议的字符串对象。getRef(): 返回URL中的HTML文档标记,即#号标记。getUserInfo(): 返回用户信息。toString(): 返回完整的URL字符串。Java常用网络类Java程序设计项目化教程3URLConnection类要接收和发关信息还要用URLConnection类,程序获得一个URLConnection对象,相当于完成对指定URL的一个HTTP连接。以下是示意获得URLConnection对象的代码。URL mu = new URL(“http:/ muC = mu.openConnection();/获得URLConnection对象上述代码说明,先要创建一个URL对象,然后利用URL对象的openConnection()方法,从系统获得一个URLConnection对象。程序有了URLConnection对象后,就可使用URLConnection类提供的以下方法获得流对象和实现网络连接:getOutputStream():获得向远程主机发送信息的OutputStream流对象;getInputStream():获得从远程主机获取信息的InputStream流对象。有了网络连接的输入和输出流,程序就可实现远程通信;connect():设置网络连接。发送和接收信息要获得流对象,并由流对象创建输入或输出数据流对象。然后,就可以用流的方法访问网上资源。如同本地数据流一样,网上资源使用结束后,数据流也应及时关闭。例如,代码dis.close();关闭先前代码建立的流dis。Java常用网络类Java程序设计项目化教程请查看教材文件10-7。 案例代码Java常用网络类Java程序设计项目化教程TCP通信同UDP通信一样,也能实现两台计算机之间的通信,但TCP通信的两端需要创建socket对象。UDP通信与TCP通信的区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据;而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。在JDK中提供了两个用于实现TCP程序的类,一个是ServerSocket类,用于表示服务器端;一个是Socket类,用于表示客户端。通信时,首先要创建代表服务器端的ServerSocket对象,创建该对象相当于开启一个服务,此服务会等待客户端的连接;然后创建代表客户端的Socket对象,使用该对象向服务器端发出连接请求,服务器端响应请求后,两者才建立连接,开始通信。TCP网络编程Java程序设计项目化教程了解了ServerSocket、Socket在服务器端与客户端的通信过程后,本节将针对ServerSocket和Socket进行详细的讲解。一、ServerSocket在开发TCP程序时,首先需要创建服务器端程序。JDK的包中提供了一个ServerSocket类,该类的实例对象可以实现一个服务器端的程序。通过查阅API文档可知,ServerSocket类提供了多种构造方法。接下来就对ServerSocket的构造方法进行逐一地讲解。1ServerSocket()使用该构造方法在创建ServerSocket对象时并没有绑定端口号,这样的对象创建的服务器端没有监听任何端口,不能直接使用,还需要继续调用bind(SocketAddress endpoint)方法将其绑定到指定的端口号上,才可以正常使用。2ServerSocket(int port)使用该构造方法在创建ServerSocket对象时,可以将其绑定到一个指定的端口号上(参数port就是端口号)。端口号可以指定为0,此时系统就会分配一个还没有被其他网络程序所使用的端口号。由于客户端需要根据指定的端口号来访问服务器端程序,因此端口号随机分配的情况并不常用,通常都会让服务器端程序监听一个指定的端口号。TCP网络编程Java程序设计项目化教程3ServerSocket(int port, int backlog)该构造方法就是在第二个构造方法的基础上,增加了一个backlog参数。该参数用于指定在服务器忙时,可以与之保持连接请求的等待客户数量,如果没有指定这个参数,默认为50。4ServerSocket(int port, int backlog, InetAddress bindAddr)该构造方法就是在第三个构造方法的基础上,增加了一个bindAddr参数,该参数用于指定相关的IP地址。该构造方法的使用适用于计算机上有多块网卡和多个IP的情况,使用时可以明确规定ServerSocket在哪块网卡或IP地址上等待客户的连接请求。显然,对于一般只有一块网卡的情况,就不用专门的指定了。在以上介绍的构造方法中,第二个构造方法是最常使用的。TCP网络编程Java程序设计项目化教程ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求时,accept()方法才会返回一个Socket对象用于和客户端实现通信,程序才能继续向下执行。TCP网络编程方法声明功能描述Socket accept()该方法用于等待客户端的连接,在客户端连接之前一直处于阻塞状态,如果有客户端连接就会返回一个与之对应的Socket对象InetAddress getInetAddress()该方法用于返回一个InetAddress对象,该对象中封装了ServerSocket绑定的IP地址boolean isClosed()该方法用于判断ServerSocket对象是否为关闭状态,如果是关闭状态则返回true,反之则返回falsevoid bind(SocketAddress endpoint)该方法用于将ServerSocket对象绑定到指定的IP地址和端口号,其中参数endpoint封装了IP地址和端口号Java程序设计项目化教程二、SocketServerSocket对象可以实现服务端程序,但只实现服务器端程序还不能完成通信,此时还需要一个客户端程序与之交互,为此JDK提供了一个Socket类,用于实现TCP客户端程序。通过查阅API文档可知,Socket类同样提供了多种构造方法。接下来就对Socket的常用构造方法进行详细讲解。1Socket()使用该构造方法在创建Socket对象时,并没有指定IP地址和端口号,也就意味着只创建了客户端对象,并没有去连接任何服务器。通过该构造方法创建对象后还需调用connect(SocketAddress endpoint)方法,才能完成与指定服务器端的连接,其中参数endpoint用于封装IP地址和端口号。2Socket(String host, int port)使用该构造方法在创建Socket对象时,会根据参数去连接在指定地址和端口上运行的服务器程序,其中参数host接收的是一个字符串类型的IP地址。3Socket(InetAddress address, int port)该构造方法在使用上与第二个构造方法类似,参数address用于接收一个InetAddress类型的对象,该对象用于封装一个IP地址。TCP网络编程Java程序设计项目化教程TCP网络编程方法声明功能描述int getPort()该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号InetAddress getLocalAddress()该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回void close()该方法用于关闭Socket连接,结束本次通信。在关闭Socket之前,应将与Socket相关的所有的输入输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源InputStream getInputStream()该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据OutputStream getOutputStream()该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器端的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据Java程序设计项目化教程上表中列举了Socket类的常用方法,其中getInputStream()和getOutputStream()方法分别用于获取输入流和输出流。当客户端和服务端建立连接后,数据是以IO流的形式进行交互的,从而实现通信。接下来通过一张图来描述服务器端和客户端的数据传输。TCP网络编程Java程序设计项目化教程三、简单的TCP网络程序通过前面的讲解,读者已经了解了ServerSocket、Socket类的基本用法。为了让初学者更好地掌握这两个类的使用,接下来通过一个TCP通信的案例来进一步学习这两个类的用法。要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序。接下来,我们来编写客户端程序。TCP网络编程请查看教材文件10-8,10-9。 案例代码Java程序设计项目化教程四、多线程的TCP网络程序在前面的案例中,分别实现了服务器端程序和客户端程序,当一个客户端程序请求服务器端时,服务器端就会结束阻塞状态,完成程序的运行。实际上,很多服务器端程序都是允许被多个应用程序访问的,例如门户网站可以被多个用户同时访问,因此服务器都是多线程的。下面就通过一个图例来表示多个用户访问同一个服务器,TCP网络编程Java程序设计项目化教程上图中,代表的是多个客户端访问同一个服务器端,服务器端为每个客户端创建一个对应的Socket,并且开启一个新的线程使两个Socket建立专线进行通信。接下来根据上图所示的通信方式对例10-9中的服务端程序进行改进。TCP网络编程请查看教材文件10-10。 案例代码任务实施Java程序设计项目化教程实现思路1、服务器端应该具备这样的功能:每连接一个客户端,就为该客户端开辟一个线程进行服务,当该客户端下线后,结束该线程。2、服务器端为客户端提供的服务包括:获取客户端的基本信息、接收客户端消息、向所有在线用户发送某用户的下线命令、向所有客户端转发消息。3、客户端应该具备这样的功能:连接服务器端,向服务器发送基本信息;从服务器端接收消息并按照预先规定好的命令完成以下操作被动下线、更新在线用户列表、加载在线用户列表、显示消息。Java程序设计项目化教程请查看教材相关内容。 实现代码实现代码任务小结Java程序设计项目化教程任务小结Java 应用程序通过多线程技术共享系统资源,可以说,Java 语言对多线程的支持增强了 Java 作为网络程序设计语言的优势,为实现分布式应用系统中多用户并发访问,提高服务器效率奠定了基础。多线程编程是编写大型软件必备的技术,读者应该作为重点和难点学习。另外,本任务介绍了Java网络编程的相关知识。简要介绍了TCP协议和UDP协议的区别,以及IP地址、端口号、InetAddress类。着重介绍了与TCP网络编程相关的ServerSocket类、Socket类。通过本任务的学习,大家能够了解网络编程的相关知识,熟练掌握TCP网络程序的编写。