1、单元 21 网络编程单元目标 理解并掌握网络通信的概念和方法 掌握网络通信中 TCP/IP 协议的编程原理 理解并掌握 Socket/ServerSocket 类的使用方法 掌握网络通信中 UDP 协议的编程原理 理解并掌握 URL 类的使用方法 理解并掌握 DatagramSocket/DatagramPacket 类的使用方法学习任务 011.任务描述网络聊天系统利用 Internet 的资源优势和技术优势, 为人们提供了一种方便快捷的信息交流和沟通方式。本次任务要运用套接字实现一个多人网络聊天程序。任务要求如下: 在 C/S(客户端/服务器)模式下运行。 服务器端负责监听和转发客户端发送
2、的消息。 实现聊天记录的保存和查看。2.运行结果知识准备21.1 网络通信与网络协议基础计算机网络是利用通讯设备和线路将地理位置不同的、 功能独立的多个计算机系统互连起来,以功能完善的网络软件(即网络通信协议、信息交换方式及网网络聊天程序设计网络聊天程序设计络操作系统等)实现网络中资源共享和信息传递的系统。计算机网络通常由三个部分组成,分别是资源子网、通信子网和通信协议。所谓通信子网就是计算机网络中负责数据通信的部分; 资源子网是计算机网络中面向用户的部分,负责全网络面向应用的数据处理工作;而通信双方必须共同遵守的规则和约定就称为通信协议, 它的存在与否是计算机网络与一般计算机互连系统的根本区
3、别。21.1.1 计算机网络的体系结构网络体系结构指的是通信系统的整体设计,它的目的是为网络硬件、软件、协议、存取控制和拓扑提供标准。现在广泛采用的是开放系统互连参考模型OSI(Open System Interconnection),如图 5-16 所示,它是用物理层、数据链路层、网络层、传输层、会话层、表示层和应用层七个层次描述网络的结构。网络体系结构的优劣将直接影响网络的性能。图 5-16 开放系统互连参考模型21.1.2 计算机网络的协议所谓协议协议(Protocol)就是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。 依据网络的不同通常使用 Ethernet(以太网)、
4、NetBEUI、 IPX/SPX以及 TCP/IP 协议。 Ethernet 是总线型协议中最常见的网络底层协议,安装方便且造价便宜。而 NetBEUI 可以说是专为小型局域网设计的网络协议。对那些无需跨路由器与大型主机通信的小型局域网,安装 NetBEUI 协议就足够了,但假如需要路由到另外的局域网, 就必须安装 IPX/SPX 或 TCP/IP 协议。 TCP/IP(传输控制协议/网间协议)是开放系统互连协议中最早的协议之一,也是目前最完全和应用最广的协议,能实现各种不同计算机平台之间的连接、交流和通信。1. 传输控制协议 TCP传输控制协议(TCP)属于 TCP/IP 协议族的传输层,提
5、供可靠的数据传输服务。TCP 是一种面向连接的传输层协议,意味着该协议准备发送数据时,通信之间必须建立起一个逻辑上的连接。TCP 协议位于 IP 协议的上层,通过提供校验和、流控制及序列信息弥补 IP 协议可靠性的缺陷。2. IP 协议IP 是英文 Internet Protocol (网络之间互连的协议) 的缩写, 中文简称为 “网协” ,也就是为计算机网络相互连接进行通信而设计的协议。数据帧的 IP 部分被称为一个 IP 数据报, IP 数据报如同数据的封面, 包含了路由器在子网中传输数据所必须的信息。IP 协议是一种不可靠的、无连接的协议。然而,TCP/IP 协议族中更高层协议可使用 I
6、P 信息确保数据包按正确的地址进行传输。3. 用户数据报协议 UDP用户数据报协议 UDP(User Datagram Protocol) ,位于 TCP/IP 协议族的传输层。不同于 TCP 的是,它是一种无连接的传输服务,它不保证数据包以正确的顺序接收。4. 超文本传输协议 HTTP超文本传输协议 HTTP 是 TCP/IP 协议族的应用层协议。 客户和 WWW 服务器之间的交互规则就是 HTTP。5. 文件传输协议 FTP文件传输协议 FTP (File Transfer Protocol) 是应用较广泛的网络协议之一,也是是 Internet 上最早使用的文件传输程序,它定义了在两台机
7、器间传输文件的规程。FTP 协议可以支持文件在网络上不同机器之间的来回拷贝。21.2 基于 TCP/IP 的网络编程原理Java 网络编程可以使用不同的通信协议, 本任务使用 TCP/IP 协议进行网络编程。IP 地址用于区分网络上不同的主机。端口用于区分同一机器上不同的通信程序,编号 0-1023 的端口为系统预定义使用,编号 1024-65535 的端口留给一般应用程序使用。套接字(套接字(Socket)是 Internet 通信的端点,与主机地址和端口号相关联。客户端和服务器通过套接字建立连接和进行通信。在 TCP/IP 协议中, TCP 提供可靠的连接服务, 采用三次握手建立一个连接。
8、具体过程如图 5-17 所示:第一次握手:客户端请求连接,发送 SYN 包到服务器,并进入 SYN_SEND状态,等待服务器确认。第二次握手:服务器收到 SYN 包,必须确认客户的 SYN,同时自己也发送一个 SYN 包,即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。第三次握手:客户端收到服务器的 SYNACK 包,向服务器发送确认包ACK,此包发送完毕后,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。完成三次握手后,客户端与服务器开始传送数据。图 5-17TCP 协议三次握手过程分析21.3 TCP/IP 网络编程相关类21.3.1 Socket 类Soc
9、ket 类用于客户端程序,当客户端与服务端通讯的时候,客户程序会在客户端创建一个 Socket 对象,建立服务器和客户端之间的连接。Socket 类的常用构造方法:Socket(String hostName, int port)创建一个流套接字并将其连接到指定主机上的指定端口号。Socket(InetAddress a, int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号。Socket 类的其他常用方法:InetAddress getInetAddress( ) 返回套接字连接的地址。int getPort( ) 返回此套接字连接到的远程端口。int getLocal
10、Port( ) 返回此套接字绑定到的本地端口。InputStream getInputStream() 返回此套接字的输入流。OutputStream getOutputStream() 返回此套接字的输出流。21.3.2 ServerSocket 类ServerSocket 类用于服务端程序,服务端需要创建 ServerSocket 对象监听特定端口,接收客户连接请求,并基于该请求执行某些操作,然后向请求者返回结果。ServerSocket 类的常用构造方法:ServerSocket(int port) 创建绑定到特定端口的服务器套接字。ServerSocket(int port, int
11、maxqu) 创建绑定到特定端口的服务器套接字,maxqu为队列的最大长度。ServerSocket 类的其他常用方法:accept()方法用于等待客户端触发通信,会阻塞线程,等待直到有客户连接才返回。close()方法用于关闭服务器端建立的套接字。21.3.3 Socket 通信方式利用 Socket 方式进行数据通信与传输的整个过程如图 5-18 所示:Socket对象代表主叫方,ServerSocket 对象代表被叫方,执行 accept()方法表示同意建立连接。连接一旦建立,会自动创建一个输入流和一个输出流,通过这两个流可以实现数据的发送。accept()建立连接输入流输出流Socke
12、tSocket输入流输出流ServerSocket图 5-18 Socket 通信示意图【实例 5-15】演示如何创建服务端程序。 【源代码 5-20】要求要求:服务器启动后等待客户端连接,有客户端连接时,执行 accept()方法返回一个 Socket 对象。通过此 Socket 对象可获得输入流和输出流。通过输入流,可获取客户端传入的数据。如果获取的数据为“JAVA” ,则通过输出流向客户端传送“有效口令”四个字,否则向客户端传送“无效口令”四个字。/省略类的定义和异常处理ServerSocket ss = new ServerSocket(4001);Socket so = ss.acc
13、ept();BufferedReader b = new BufferedReader(new InputStreamReader(so.getInputStream();String passwd = b.readLine();String response;if(passwd.equals(JAVA)response = 有效口令;elseresponse = 无效口令;PrintStream p = new PrintStream(so.getOutputStream();p.println(response);so.close();/省略调用过程【实例 5-16】演示如何创建客户端程序
14、。 【源代码 5-21】要求:要求:通过使用相同的端口号来连接例 5-21 的服务器程序。本例的服务端与客户端程序应当运行在同一台主机上,因为程序中的 Socket 对象是通过localhost 创建的。该客户端程序从控制台读入用户输入信息,将其发送给服务器,然后读取并显示服务器返回的信息。/省略类的定义和异常处理Socket so = new Socket(localhost, 4001);BufferedReader b1 = new BufferedReader(new InputStreamReader(System.in);String passwd = b1.readLine();
15、PrintStream p = new PrintStream(so.getOutputStream();BufferedReader b2 = new BufferedReader(new InputStreamReader(so.getInputStream();String r = b2.readLine();网络聊天程序设计网络聊天程序设计System.out.println(r);so.close();/省略调用过程任务实施1实现思路综合运用流、线程和 Socket 技术实现本任务中的网络聊天程序。把服务端程序定义为 ChatServer,先于客户端程序运行,监听并接受多个客户端的连
16、接。把客户端程序定义为 ChatClient,负责将用户的输入信息发送到服务端。服务端程序接受客户信息并将其转发给其他客户端。(1)定义 Client 类实现 Runnable 接口,作为客户端代理,目的是在服务器端为每个客户端创建一个单独的通信线程(2)定义 ChatServer 类,等待客户的连接请求,用列表 clients 保存客户端代理,每次和一个客户端建立连接,创建一个代理对象放入列表 clients 中(3) 定义 ChatClient 类继承 JFrame, 实现客户端界面, 与服务器建立连接,接收用户输入发送给服务器并显示服务器发送来的信息2.程序代码Client 类的关键代码
17、如下:/省略类与成员的定义public Client(Socket s,int client_no) /省略成员初始化与异常处理语句dis = new DataInputStream(s.getInputStream(); / 初始化流对象dos = new DataOutputStream(s.getOutputStream();public void send(String str) /用于发送消息给客户端try dos.writeUTF(str); catch (IOException e) clients.remove(this); / 移除退出的对象public void run()
18、 网络聊天程序设计/省略异常处理while (cont) String str = dis.readUTF();/ 阻塞式方式String prefix = Client_ + client_no + :;str =prefix + str;System.out.println(str);for (int i = 0; i clients.size(); i+) Client c = clients.get(i);/ 获取客户端代理c.send(str);if(log!= null & c = this)/省略异常处理log.writeBytes(str+rn); /保存记录服务器端的关键代码
19、如下:/省略类的声明List clients = new ArrayList(); /用于存储客户端对象public ChatServer()/省略异常处理log = new DataOutputStream(new FileOutputStream(chatlog.txt);public void start() /省略异常处理ss = new ServerSocket(8888);stat = true;while (stat) Socket s = ss.accept();/ 每建立一个客户端,就创建一个客户端对象,启动一个线程Client c = new Client(s,maxCli
20、entNo+);new Thread(c).start();clients.add(c); / 勿忘写,将每个客户端加入到容器里客户端的关键代码如下:网络聊天程序设计Thread tRecv = new Thread(new RecvThread();public static void main(String args) new ChatClient().launchFrame();public void launchFrame() /省略窗体布局设置代码this.addWindowListener(new WindowAdapter() public void windowClosing(
21、WindowEvent e) disconnect(););tfTxt.addActionListener(new TfListent();/省略控件设置代码connect();tRecv.start(); / 启动线程public void connect() /省略异常处理代码s = new Socket(127.0.0.1, 8888);/s为局部变量dos = new DataOutputStream(s.getOutputStream();dis = new DataInputStream(s.getInputStream();public void disconnect() /省略
22、异常处理dos.close();dis.close();s.close();private class TfListent implements ActionListener public void actionPerformed(ActionEvent e) String str = tfTxt.getText().trim();tfTxt.setText();/省略异常处理dos.writeUTF(str);dos.flush();网络聊天程序设计private class RecvThread implements Runnable public void run() while (co
23、nt) /省略异常处理String str = dis.readUTF();taContent.setText(taContent.getText() + str + n);任务拓展Internet 上的主机有两种表示地址的方式:域名和 IP 地址。有时候需要通过域名来查找它对应的 IP 地址,有时候又需要通过 IP 地址来查找主机名。可以利用 包中的 InetAddress 类来完成任务。InetAddress 类没有公共的构造方法, 程序员只能利用该类的一些静态方法来获取对象实例,然后再通过这些对象实例来对 IP 地址或主机名进行处理。该类常用的一些方法如下:pulic static In
24、etAddress getByName(String hostname)根据给定的主机名创建一个 InetAddress 对象,可用来查找该主机的 IP 地址。public static InetAddress getByAddress(byte addr) 根据给定的 IP 地址创建一个 InetAddress 对象,可用来查找该 IP 对应的主机名。public String getHostAddress() 获取 IP 地址。public String getHostName() 获取主机名。下面通过两个实际的例子来说明它的使用方法。【实例 5-17】演示 InetAddress 类的用
25、法。 【源代码 5-22】要求:要求:获取并显示了本机和新浪网的 IP 地址。运行此程序,要求电脑能够联通互联网,否则需要给新浪网那行代码加上注释,不然会出异常的。/省略类的定义与异常处理InetAddress add = InetAddress.getLocalHost();System.out.println(本主机的地址是 + add);System.out.println(新浪网的地址是 +add.getByName();网络聊天程序设计程序运行结果如下:程序运行结果如下:本主机的地址是 dadi-pc/192.168.1.125新浪网的地址是 掌握创建基于 TCP 有连接的网络应用程
26、序; 掌握创建服务端套接字的方法; 掌握创建客户端套接字的方法; 掌握从连接中读取信息; 掌握向连接中写入信息。2.实训内容用 Socket 实现客户和服务器交互的典型 C/S 结构的聊天程序。学习任务 021.任务描述为了进一步掌握网络编程技术,本次任务要基于 UDP 实现一个局域网聊天系统。任务要求如下: 客户端采用 UDP 协议与服务器连接 客户端可以设置服务器地址与端口 服务器可以维护客户端个人信息 服务器可以记录客户端状态信息2.运行结果网络聊天程序设计知识准备21.4 基于 UDP 的网络编程原理用户数据包协议 (UDP) 是 OSI 参考模型中一种无连接的传输层协议, IETFR
27、FC 768 是 UDP 的正式规范。如图 5-19 所示,UDP 在传输数据之前,客户端和服务器端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP 传送数据的速度仅仅受应用程序生成数据的速度、计算机性能和传输带宽的限制;在接收端,UDP 把每个消息段放在队列中, 应用程序每次从队列中读一个消息段。 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一个服务端可同时向多个客户端传输相同的消息。图 5-19 UDP 通信方式【小提示】无连接网络聊天程序设计TCP 协议与 UDP 协议的区别:TCP 提供的服务包括数据流传
28、送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端进行数据包通信,可以保证数据通信的可靠性。 但是,由于传输过程需要进行三次握手,所以传输速度相对较慢。而 UDP 则不为 IP 提供可靠性、流控或差错恢复功能,因此,传输速度较快。一般来说,TCP 对应的是可靠性要求较高的应用,而 UDP 对应的则是可靠性要求较低的应用。TCP 支持的应用协议主要有:Telnet、FTP、SMTP 等;UDP 支持的应用层协议主要有:NFS(网络文件系统) 、SNMP(简单网络管理协议) 、DNS(主域名称系统) 、TFTP(通用文件传输协议)等。21.5 UDP 网络编程相关类的使用21.5.1
29、 DatagramPacket 类DatagramPacket 类表示数据报包,起到数据容器的作用。数据报包用来实现无连接包投递服务。 每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。DatagramPacket 构造方法如下:DatagramPacket(byte data, int size) 构造 DatagramPacket,用来接收长度为 length 的数据包。DatagramPacket(byte data, int size, InetAddress I, int por
30、t) 构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号21.5.2 DatagramSocket 类DatagramSocket 类表示用来发送和接收数据报包的套接字,用于发送或接收 DatagramPacket。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。 从一台机器发送到另一台机器 的 多 个 包 可 能 选 择 不 同 的 路 由 , 也 可 能 按 不 同 的 顺 序 到 达 。 在DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将DatagramSocket 绑定到通配符地址。在
31、某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。DatagramSocket s = new DatagramSocket(null);s.bind(new InetSocketAddress(8888);等价于:DatagramSocket s = new DatagramSocket(8888);这两个例子都能创建能够在 UDP 8888 端口上接收 DatagramSocket。DatagramSocket 构造方法:DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。DatagramSocket(int p
32、ort)创建数据报套接字并将其绑定到本地主机上的指定端口。其他常用方法:void send(DatagramPacket d) 从此套接字发送数据报包。void receive(DatagramPacket p) 从此套接字接收数据报包。void close() 关闭此数据报套接字。【实例 5-18】演示通过 UDP 协议通信的过程。 【源代码 5-23】要求:要求:DatagramServer 类接收用户从控制台输入的字符串,并将字符串发送给 DatagramClient。DatagramClient 接收并显示收到的字符串。当用户输入end 时,DatagramServer 发送完就退出运
33、行。DatagramClient 接收到 end 字符串后也立刻退出运行。服务器端关键代码如下:/DatagramServer类省略定义byte buffer = new byte1024;ds = new DatagramSocket(SERVER_PORT);BufferedReader dis = new BufferedReader(newInputStreamReader(System.in);System.out.println(服务器正在等待输入);InetAddress ia = InetAddress.getByName(localhost);while(true)Strin
34、g str = dis.readLine();buffer = str.getBytes();ds.send(new DatagramPacket(buffer, str.length(), ia, CLIENT_PORT);if( (str = null) | str.equals(end) )break;System.out.println(服务器退出运行);无连接网络聊天程序设计客户关键代码如下:/DatagramClient类省略定义ds = new DatagramSocket(CLIENT_PORT);System.out.println(客户机正在等待服务器发送数据);while
35、(true)DatagramPacket p = new DatagramPacket(buffer, buffer.length);ds.receive(p);String psx = new String(p.getData(), 0, p.getLength();System.out.println(psx);if(psx.equalsIgnoreCase(end)break;System.out.println(客户机退出运行);服务器端程序运行结果如下:服务器端程序运行结果如下:服务器正在等待输入HelloEnd服务器退出运行客户端程序运行结果如下:客户端程序运行结果如下:客户机正在
36、等待服务器发送数据HelloEnd客户机退出运行21.5.3 网络编程实现广播Java 网络编程还可以实现广播功能广播功能。广播通信的特点是一个发送,多个接收。广播使用特殊 IP 地址,范围在 224.0.0.0239.255.255.255 之间。广播使用的类有:MulticastSocket 和 DatagramPacket。发送广播消息的程序代码如下:MulticastSocket s = new MulticastSocket(6789); / 构造广播对象/ 加入广播组InetAddress group = InetAddress.getByName(228.5.6.7);s.joi
37、nGroup(group);/ 创建数据包String msg = Hello;无连接网络聊天程序设计无连接网络聊天程序设计DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 6789);/ 设置发送范围、发送s. setTimeToLive(1);s.send(hi);接收广播消息的程序代码如下:MulticastSocket s = new MulticastSocket(6789);/ 构造广播对象/ 加入广播组InetAddress group = InetAddress.getByNa
38、me(228.5.6.7);s.joinGroup(group);/ 准备缓冲区byte buf = new byte1000;DatagramPacket recv = new DatagramPacket(buf, buf.length);s.receive(recv); / 接收数据s.leaveGroup(group);/离开分组任务实施1.实现思路创建一个类 UdpDialogFrame,既作为信息发送端,又作为信息接收端。程序运行时,显示本机 IP 地址和所用端口号。允许用户输入信息发送目标的 IP 地址和端口号。在线程体中接收数据包,在 TextListener 接口的文本变化事
39、件处理方法中发送数据包。 定义类UdpDialogFrame继承Frame实现TextListener, Runnable接口。 在 UdpDialogFrame 类的构造方法中构造窗口界面,启动数据接收线程 在 textValueChanged 方法中发送信息 在 run 方法中接收并显示信息 创建主类 UdpDemo,创建 UdpDialogFrame 类对象2.程序代码/省略窗体控件初始化代码public UdpDialogFrame() super(随心聊);init();/调用窗体控件初始化方法/ 窗口事件处理无连接网络聊天程序设计无连接网络聊天程序设计addWindowListen
40、er(new WindowAdapter() / 关闭窗口事件处理public void windowClosing(WindowEvent e) if (m_thRecieve.isAlive() m_thRecieve.stop();System.exit(0); / 退出程序);m_thRecieve = new Thread(this);m_thRecieve.start();/ 文本变化事件处理public void textValueChanged(TextEvent e) if (e.getSource() = m_taSend) String s = m_taSend.getT
41、ext();if (s.length() 0 & s.endsWith(n) / 回车发送/省略异常处理byte data = s.getBytes();int nPort = Integer.parseInt(m_tfDestPort.getText();InetAddress destIP =InetAddress.getAllByName(m_tfDestIP.getText();if (destIP.length 0) DatagramPacket pak = new DatagramPacket(data,data.length, destIP0, nPort);/省略异常处理Dat
42、agramSocket skt = new DatagramSocket();System.out.println(senddata=);skt.send(pak);m_taSend.setText();/ 接收线程处理public void run() DatagramSocket skt = new DatagramSocket(980);byte data = new byte1024;DatagramPacket pak = new DatagramPacket(data, data.length);while (true) /省略异常处理skt.receive(pak);if (pa
43、k.getLength() 0) String s = new String(data);String t = m_taGet.getText();System.out.println(getdata= + pak.getLength() + n);if (t.endsWith(n) m_taGet.setText(t + s); else m_taGet.setText(t + n + s);for (int i = 0; i data.length; i+) datai = 0;/省略调用任务拓展Java 程序也可以象浏览器那样获取互联网资源。 URL 指向 Internet 上的资源文件
44、。URL 的组成部分依次包括协议、IP 地址或主机名、端口号、实际文件路径。如 http:/localhost:8084/index.htm 中 http 代表协议,localhost 代表主机名,8084 是端口号,index.htm 代表服务器上的文件名。因此,通过 URL就可以定位互联网上任意一台服务器上的文件。一个 URL 对象 代表一个统一资源定位符, 它是指向互联网 “资源” 的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。URL 类提供 API 来访问 Internet 上的信息。URL 类的构造方法:URL(String url
45、name) 根据String表示形式创建URL对象.URL(String protocol, String hostname, int port, String path) 根 据 指定protocol、host、port号和file创建URL对象.URL(String protocol, String hostname, String path) 根据指定的protocol名称、host名称和file名称创建 URL.【实例 5-19】演示 URL 类中几个方法的使用。 【源代码 5-24】说明:说明:如果 URL 格式不正确,程序会出 MalformedURLException 异常。/省
46、略异常处理URL url = new URL(http:/:80/root/htmlfiles/index.html);System.out.println(URL中的主机是:+url.getHost();System.out.println(使用的协议是:+url.getProtocol();System.out.println(使用的端口是:+url.getPort();System.out.println(调用的文件是:+url.getFile();程序运行结果如下:程序运行结果如下:URL中的主机是:使用的协议是:http使用的端口是:80调用的文件是:/root/htmlfiles/
47、index.html【实例 5-20】演示通过 Java 程序调用百度搜索引擎获取搜索的网页结果。【源代码】/省略变量定义String makeUrl(String keyWords,int nPage)String rt = http:/ += keyWords;rt += &pn=;rt += nPage*10;rt += &cl=3;System.out.println(rt);return rt;String searchOnePage(String keyWords,int nPage)String content = ;URL url = null;URLConnection co
48、nn = null;String nextLine = ;StringTokenizer tokenizer = null;无连接网络聊天程序设计无连接网络聊天程序设计Collection urlCollection = new ArrayList();url = new URL(makeUrl(keyWords,nPage);/省略异常处理conn = url.openConnection();conn.setDoOutput(true);conn.connect();BufferedReader reader = new BufferedReader(newInputStreamReader( conn.getInputStream() ) );while(nextLine = reader.readLine() != null )content += nextLine;content += n;return content;/省略调用【思考】网络游戏中,不同玩家的网速、计算机运行速度都不相同,如何实现所有玩家看到的游戏状态是一致的?任务实训1.实训目的 熟练数据报的发送和接收; 能使用 DatagramPacket 类创建数据报对象并在应用程序之间建立传送数据报的通讯连接。2.实训内容用UDP协议实现聊天程序。无连接网络聊天程序设计