1、第一单元网络编程学习指导书一:学习目标(知识点列表)知识点 知识点重要性掌握程度 知识点关联基于 TCP 协议的网络编程1、 Socket 类2、 ServerSocket 类中 熟练 域名和 IP(参见学习资料第二册 180 页) ,对该主题下所有这几类,非常的常用必须灵活把握,对后续编写基于 TCP 协议的软件提供可靠基础。适当了解网络基础知识对于学习网络编程是有必要的,比如什么是IP和端口了解什么是UDP网络编程?明白UDP网络编程与Tcp编程的区别:Tcp是建立有连接的网络通信,而UDP不需要建立连接,通过在网络广播发送理解Socket和ServerSocket 是学习网络编程的关键点
2、。基于 UDP 协议的网络编程1、 DategramSocket类2、 DatagramPacket类高 熟练 是此知识点运用的前提,因此在学习此部分时,需要回顾下有关输入输出的知识点。适当了解网络基础知识对于学习网络编程是有必要的,比如什么是IP和端口了解什么是UDP网络编程?明白UDP网络编程与Tcp编程的区别:Tcp是建立有连接的网络通信,而UDP不需要建立连接,通过在网络广播发送理解DatagramSocket和DatagramPacket 是学习UDP 网络编程 的突破点DatagramSocket表示用来发送和接收数据报包的套接字,不建立连接,不进行数据数据读写DatagramPa
3、cket表示数据报包,数据报包用来实现无连接包投递服务1、传送数据的载体2、包含从一台机器路由到另一台机器的信息web 相关类1、 URL2、 URLConnection3、 URLEncoder中 了解 了解 web 基础概念是有必要的 例如:URL、Http了解 URLConnection:代表应用程序和 URL 之间的通信链接了解创建 URL 连接需要的步骤重难点 1:Java 编写 TCP、UDP 程序 学习方法: 首先复习下 Ip 和端口:IP 地址:给因特网上的每台计算机和其它设备都规定了一个唯一的地址,叫做“IP 地址”。由于有这种唯一的地址,才保证了用户在连网的计算机上操作时,
4、能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。端口:一台拥有 IP 地址的主机可以提供许多服务,比如 Web 服务、FTP 服务、SMTP 服务等,这些服务完全可以通过 1 个 IP 地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠 IP 地址,因为 IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP 地址+端口号”来区分不同的服务的。 需要注意的是,端口并不是一一对应的。比如你的电脑作为客户机访 问一台 WWW服务器时,WWW 服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口举个简单的例子吧:你把 ip 地址想象成一个人;
5、端口呢,分别是 眼睛,耳朵,鼻子,嘴巴;你(ip)要和别人说话,用嘴巴;你(ip)要听别人说话,用耳朵;你(ip)要闻味道,要用鼻子;网络上,每个端口都承载了不同的通信的功能。Java 编写 UDP 网络程序1.1,DatagramSocketDatagramSocket 有如下构造方法 :1,DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。 2,DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。 3,DatagramSocket(int port, InetAddress laddr):创建数据报套接
6、字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.如果在创建 DatagramSocket 对象时 ,没有指定网卡的 IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.发送数据使用 DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.1.2,DatagramPacketDatagramPacket 类有如下构造方法:1,
7、DatagramPacket(byte buf, int length):构造 DatagramPacket,用来接收长度为 length 的数据包。2,DatagramPacket(byte buf, int length, InetAddress address, int port):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.1.3,InetAddressJava 中对 IP 地址进行包装的类,DatagramPacket.getAddress()可以获取发送或接收方的 IP 地址.Datagra
8、mPacket.getPort()可以获取发送或接收方的端口.1.4,UDP 程序例子发送程序:import .DatagramPacket; import .DatagramSocket; import .InetAddress; public class UdpSend public static void main(String args) throws Exception DatagramSocket ds = new DatagramSocket(); String str = “hello , world!“; DatagramPacket dp = new DatagramPac
9、ket(str.getBytes(),str.length(),InetAddress.getByName(“192.168.0.105“),3000); ds.send(dp); ds.close(); /关闭连接 接收程序:import .DatagramPacket; import .DatagramSocket; public class UdpRecv public static void main(String args) throws Exception DatagramSocket ds = new DatagramSocket(3000); byte buf = new by
10、te1024; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp); String str = new String(dp.getData(),0,dp.getLength(); System.out.println(str); System.out.println(“IP:“ + dp.getAddress().getHostAddress() + “,PORT:“ + dp.getPort(); ds.close(); 测试要先运行接收程序,再运行发送程序.如果接收程序没有接收到数据,则会一直阻塞,接
11、收到数据后才会关闭程序.如果网络上没有数据发送过来,接收程序也没有阻塞,通常都是使用了一个已经被占用的端口.理解UDP 编程的实现基本步骤1、创建数据报2、发送数据报包3、接受数据报包重难点 2:Socket 与 ServerSocket学习方法:1、 理解 Socket 类的含义Socket(套接字)是服务器与客户的连接桥梁,套接字 是两台机器间通信的端点,首先通过套接字建立客户和服务器的连接,然后通过套接字这个载体实现将客户与服务器之间的信息传递,ServerSocket(服务器套接字)等待请求通过网络传入的Socket,然后可以向请求者(Socket)返回结果。 理解Socket编程的实
12、现基本步骤1、如何建立客户和服务连接2、如何实现客户与服务器之间的信息传递2、 理解 Socket 类的使用1)构造Socket socket=new Socket(“10.10.1.10“,5657);实现向服务器(10.10.1.10)的 5657 端口发送请求2)获得读写套接字的 I/O 流OutputStream os=socket.getOutputStream();InputStream is=socket.getInputStream();3)使用 I/O 链读写套接字(参考 I/O 部分) ,实现信息的传递3、理解 ServerSocket 类的作用等待请求通过网络传入的 So
13、cket,若侦听到即接受到此套接字4、ServerSocket 类的使用1)构造 ServerSocketServerSocket server=new ServerSocket(5657);在当前主机上创建服务端口 56572)侦听并接受到此套接字的连接Socket formClient=server.accept();等待并接受客户请求,具体含义有两方面:A)若侦听到则接受到客户端传送的套接字,服务器与客户建立连接B)若没有侦听到客户请求则阻塞线程,即等待客户请求5、完成简单的网络编程package tcp;import java.io.*;import .*;public class S
14、impleSocketClient public static void main(String args) Socket socket = null;InputStream is = null;OutputStream os = null;/服务器端IP地址String serverIP = “127.0.0.1“;/服务器端端口号int port = 10000;/发送内容String data = “Hello“;try /建立连接socket = new Socket(serverIP,port);/发送数据os = socket.getOutputStream();os.write(
15、data.getBytes();/接收数据is = socket.getInputStream();byte b = new byte1024;int n = is.read(b);/输出反馈数据System.out.println(“服务器反馈:“ + new String(b,0,n); catch (Exception e) e.printStackTrace(); /打印异常信息finallytry /关闭流和连接is.close();os.close();socket.close(); catch (Exception e2) 在该示例代码中建立了一个连接到IP地址为127.0.0.
16、1,端口号码为10000的TCP类型的网络连接,然后获得连接的输出流对象,将需要发送的字符串“Hello”转换为byte数组写入到输出流中,由系统自动完成将输出流中的数据发送出去,如果需要强制发送,可以调用输出流对象中的flush方法实现。在数据发送出去以后,从连接对象的输入流中读取服务器端的反馈信息,读取时可以使用IO中的各种读取方法进行读取,这里使用最简单的方法进行读取,从输入流中读取到的内容就是服务器端的反馈,并将读取到的内容在客户端的控制台进行输出,最后依次关闭打开的流对象和网络连接对象。这是一个简单的功能示例,在该示例中演示了TCP类型的网络客户端基本方法的使用,该代码只起演示目的,
17、还无法达到实用的级别。如果需要在控制台下面编译和运行该代码,需要首先在控制台下切换到源代码所在的目录,然后依次输入编译和运行命令:javac d . SimpleSocketClient.javajava tcp.SimpleSocketClient和下面将要介绍的SimpleSocketServer服务器端组合运行时,程序的输出结果为:服务器反馈:Hello介绍完一个简单的客户端编程的示例,下面接着介绍一下TCP类型的服务器端的编写。首先需要说明的是,客户端的步骤和服务器端的编写步骤不同,所以在学习服务器端编程时注意不要和客户端混淆起来。在服务器端程序编程中,由于服务器端实现的是被动等待连接
18、,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。实现服务器端监听的代码为:ServerSocket ss = new ServerSocket(10000);该代码实现的功能是监听当前计算机的10000号端口,如果在执行该代码时,10000号端口已经被别的程序占用,那么将抛出异常。否则将实现监听。服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的Socket连接对象,从而释放客户端连接对于服务器端端口的占用。实现功能就像公司的前台一样,当一个客户到达公司时,会告诉前台我找某某某,然后前台就通知某某某,然后就可以继续接待其
19、它客户了。通过获得连接,使得客户端的连接在服务器端获得了保持,另外使得服务器端的端口释放出来,可以继续等待其它的客户端连接。实现获得连接的代码是:Socket socket = ss.accept();该代码实现的功能是获得当前连接到服务器端的客户端连接。需要说明的是accept和前面IO 部分介绍的 read方法一样,都是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就可以通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又可以继续接受其它的连接了。连接获得以后,后续的编程就和客户端
20、的网络编程类似了,这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反。这部分的内容和客户端很类似,所以就不重复了,如果还不熟悉,可以参看下面的示例代码。最后,在服务器端通信完成以后,关闭服务器端连接。实现的代码为:ss.close();这就是基本的TCP类型的服务器端编程步骤。下面以一个简单的 echo服务实现为例子,介绍综合使用示例。echo的意思就是“回声”,echo服务器端实现的功能就是将客户端发送的内容再原封不动的反馈给客户端。实现的代码如下:pack
21、age tcp;import java.io.*;import .*;public class SimpleSocketServer public static void main(String args) ServerSocket serverSocket = null;Socket socket = null;OutputStream os = null;InputStream is = null;/监听端口号int port = 10000;try /建立连接serverSocket = new ServerSocket(port);/获得连接socket = serverSocket.
22、accept();/接收客户端发送内容is = socket.getInputStream();byte b = new byte1024;int n = is.read(b);/输出System.out.println(“客户端发送内容为:“ + new String(b,0,n);/向客户端发送反馈内容os = socket.getOutputStream();os.write(b, 0, n); catch (Exception e) e.printStackTrace();finallytry/关闭流和连接os.close();is.close();socket.close();ser
23、verSocket.close();catch(Exception e)在该示例代码中建立了一个监听当前计算机10000号端口的服务器端Socket连接,然后获得客户端发送过来的连接,如果有连接到达时,读取连接中发送过来的内容,并将发送的内容在控制台进行输出,输出完成以后将客户端发送的内容再反馈给客户端。最后关闭流和连接对象,结束程序。在控制台下面编译和运行该程序的命令和客户端部分的类似。这样,就以一个很简单的示例演示了TCP类型的网络编程在 Java语言中的基本实现,总结:客户端具体步骤:a) 获得服务器端IP地址b) 获得服务器端端口号c) 获得发送内容内容d) 建立连接e) 发送数据f)
24、 接收数据g) :输出反馈数据服务器具体步骤:a) 监听端口号b) 建立连接c) 获得连接d) 接收客户端发送内容e) 向客户端发送反馈内容3、 在学习 Socket 编程需要注意以下几点:(1)正确理解 Socket 和 ServerSocket 的作用(2)理解 ServerSocket 的 accept()方法的含义(3)理解读写 Socket 的含义共性问题:1、Socket 和 ServerSocket 是怎样实现网络通信?或为什么能实现通信答:这类问题一般还是对 Socket 和 ServerSocket 比较陌生不理解造成的理解Socket和ServerSocket 是学习网络编
25、程的关键点。套接字是两台机器间通信的端点,通过套接字建立客户和服务器的连接,通过套接字这 个载体实现将客户与服务器之间的信息传递ServerSocket(服务器套接字)等待接收通过网络传入的Socket,具体含义有两方面:A)若侦听到则接受到客户端传送的套接字,服务器与客户建立连接B)若没有侦听到客户请求则阻塞线程,即等待客户请求Socket编程的实现基本步骤1、通过客户端发送Socket,服务器接收这个来自客户的Socket建立客户和服务连接2、通过读写 Socket 实现客户与服务器之间的信息传递辅导视频:Socket 编程示例作业内容:参见作业文件夹补充阅读:1、 基于 TCP 的 Socket 编程2、 基于 UDP 网络编程三:补充说明本章内容包括三个部分,其中重点就是学会使用 Socket 和 ServerSocket 实现。学习应本着先掌握类的主要方法去学习,动手实现一个简单的网络编程,然后逐步学习、逐步深入。学习中需通过作业和练习,加强对网络编程的理解和认识。注:实现服务器客户端的网络通信.实现真正的 C/S 程序;并可模拟 web 服务器请求和发送静态网页.,