第11章(4学时)_第1页
第11章(4学时)_第2页
第11章(4学时)_第3页
第11章(4学时)_第4页
第11章(4学时)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、 这周:这周:11章章 Java中的网络编程中的网络编程 下周:下周:12章章 java与数据库操作与数据库操作 13周周 :复习,准备期末考试:复习,准备期末考试 此网络编程指的是此网络编程指的是C/S(客户端(客户端/服务器)编服务器)编程。程。而而Java更流行、应用广泛的网络编程是更流行、应用广泛的网络编程是B/S(浏览器(浏览器/服务器)编程。服务器)编程。但此章介绍的但此章介绍的Socket网络通信的思想非常重网络通信的思想非常重要。要。 学习学习Java实现网络编程的相关包和类实现网络编程的相关包和类 会编写会编写Java网络程序网络程序 Internet上的每台计算机是如何唯一

2、上的每台计算机是如何唯一标志出来的?标志出来的? IP地址:每个连入网络的计算机具有地址:每个连入网络的计算机具有不同的不同的IP地址。地址。 Internet上的每一台计算机都有一个地址。上的每一台计算机都有一个地址。 目前使用的目前使用的IP地址采用地址采用IPv4格式,每台主机的格式,每台主机的IP地地址是一个址是一个32位(位(4个字节)的二进制数。个字节)的二进制数。 每个每个3位十进制整数代表位十进制整数代表8位二进制数,将位二进制数,将IP地址分地址分成成4个组个组,每组之间用圆点(每组之间用圆点(.)隔开。)隔开。 IP地址中每个组可以取地址中每个组可以取0255之间的值。如之

3、间的值。如。 将将Internet地址中的数字用带有一定意义的字符串地址中的数字用带有一定意义的字符串表示,一个域名唯一对应一个表示,一个域名唯一对应一个Internet地址。地址。 如如:对应的域名为对应的域名为: 域名管理系统域名管理系统DNS(Domain Name System)是域)是域名解析服务器,它的作用是把域名转换成为网络可名解析服务器,它的作用是把域名转换成为网络可以识别的以识别的IP地址。地址。 URL(Uniform Resource Locator)是统一资源定位器是统一资源定位器的简称,它表示的简称,它表示Inter

4、net上某一资源的地址。上某一资源的地址。 URL由协议名和资源名两部分组成,两者之间用冒由协议名和资源名两部分组成,两者之间用冒号(:)隔开。表示语法如下:号(:)隔开。表示语法如下: protocol:/resourceName 协议名(协议名(protocol)表示获取资源所使用的传输协议,如)表示获取资源所使用的传输协议,如http、ftp等等 资源名(资源名(resourceName)则为要获取资源的完整地址,包)则为要获取资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。括主机名、端口号、文件名或文件内部的一个引用。 http:/:80/Gamelan/network

5、.html#BOTTOM。1. .InetAddress 创建一个创建一个InetAddress对象对象,表示一个表示一个IP地址地址:(1)public static InetAddress getByAddress(byte addr):方法返回一个方法返回一个InetAddress对象对象,如如果参数数组果参数数组addr的值既不是的值既不是4字节的也不是字节的也不是16字节的,那么方法将会抛出一个字节的,那么方法将会抛出一个UnknownHostException异常对象。异常对象。(2) public static InetAddress getByName(String host)

6、:方法返回一个方法返回一个InetAddress对象,该对对象,该对象包含了一个与象包含了一个与host参数指定的主机相对应参数指定的主机相对应的的IP地址。地址。1. .InetAddress举例举例:Example11_4.java(3)常用方法常用方法: public String getHostName ():返回返回InetAddress对象的主机名。对象的主机名。 public String getHostAddress():返回返回InetAddress对象的对象的IP地址。地址。 基于基于TCP协议协议:(对比与(对比与UDP)TCP协议协议():Tranfer Control

7、 Protocol ,传传输控制协议输控制协议.(1)网络套接字网络套接字 若实现网络通信,两个网络程序需要建若实现网络通信,两个网络程序需要建立起来一个双向传输的数据通道。立起来一个双向传输的数据通道。 这个双向链路的一端称为一个套接字这个双向链路的一端称为一个套接字(Socket)。)。服务器主机服务器主机客户客户1在某个端口上在某个端口上服务器套接字服务器套接字一个客户的一个客户的套接字套接字客户客户1套接字套接字I/O数据流数据流举例举例:socketlx1ServerLx 和和ClientLx 客户客户2客户客户2套接字套接字一个客户的一个客户的套接字套接字I/O数据流数据流服务器端

8、服务器端:public class ServerLx public static void main(String args) try ServerSocket ss=new ServerSocket(8000); /创建一个服务器套接字创建一个服务器套接字,并把它附加在一个端口上并把它附加在一个端口上Socket s=ss.accept();/该语句一直等待该语句一直等待,直到客户连接到服务器套接字直到客户连接到服务器套接字.DataInputStream dis=new DataInputStream(s.getInputStream();System.out.println(dis.re

9、adUTF();DataOutputStream dos=new DataOutputStream(s.getOutputStream();dos.writeUTF(ok); catch (IOException e) e.printStackTrace(); 客户端客户端:public class ClientLx public static void main(String args) try Socket s=new Socket(localhost,8000); /用来建立一个套接字用来建立一个套接字,以便客户程序与服务器进行通信以便客户程序与服务器进行通信.DataOutputStr

10、eam dos=new DataOutputStream(s.getOutputStream();dos.writeUTF(Hello);DataInputStream dis=new DataInputStream(s.getInputStream();System.out.println(dis.readUTF(); catch (UnknownHostException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); 要建立服务器要建立服务器,需要创建一个服务器套接字需要创建一个服务器套接字,并把它并把

11、它附加在一个端口上附加在一个端口上,服务器通过这个端口监听连接请服务器通过这个端口监听连接请求求. 注意注意:由于每一个端口提供一种特定的服务,只有给由于每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。出正确的端口,才能获得相应的服务。 01023的端口号为系统所保留,例如的端口号为系统所保留,例如http服务的端口服务的端口号为号为80,telnet服务的端口号为服务的端口号为23,ftp服务的端口号为服务的端口号为21, 所以在选择端口号时创建所以在选择端口号时创建Socket对象时,最好选对象时,最好选择一个大于择一个大于1023的端口数以防止发生冲突。的端口数以防

12、止发生冲突。ServerSocket serversocket=new ServerSocket(8000); 服务器端服务器端使用使用accept()方法接收客户的套接字请求:方法接收客户的套接字请求:Socket connecttoClient=serversocket.accept(); 该方法返回针对该客户的一个套接字对象。该方法返回针对该客户的一个套接字对象。 该方法是个阻塞方法,直到有客户端请求建立套接该方法是个阻塞方法,直到有客户端请求建立套接字连接。字连接。 客户端客户端建立建立Socket对象:对象:Socket connecttoServer;connecttoServer

13、 = new Socket(localhost, 8000); 建立建立Socket对象的过程即向服务器发出套接字连接对象的过程即向服务器发出套接字连接请求,如果服务器端对应的端口上正在使用请求,如果服务器端对应的端口上正在使用accept()等待客户,则双方套接字诞生,可以说通话已建立。等待客户,则双方套接字诞生,可以说通话已建立。 流连接:服务器端:流连接:服务器端:DataInputStream isFromClient=new DataInputStream(connecttoClient.getInputStream();DataOutputStream ostoClient=new

14、 DataOutputStream(connecttoClient.getOutputStream();从客户端过来的输入流,从客户端过来的输入流,即读客户端数据的流即读客户端数据的流向客户端写数据的输出流向客户端写数据的输出流 流连接:客户端:流连接:客户端:DataInputStream osFromServer=new DataInputStream(connecttoServer.getInputStream();DataOutputStream ostoServer=new DataOutputStream(connecttoServer.getOutputStream(); 注意:

15、当使用套接字流对象读取数据时,可能在另一端数据注意:当使用套接字流对象读取数据时,可能在另一端数据发送之前,就已经试着读取了,这会阻塞读取线程。发送之前,就已经试着读取了,这会阻塞读取线程。服务器服务器客户客户ServerSocket server;Socket socket;DataInputStream;server = new ServerSocket(8000);socket = server.accept(); dis=new DataInputStream(s.getInputStream();dis.readUTF();Socket socket;BufferedReader i

16、n;DataOutputStream dos;socket = new Socket(“localhost,8000); dos=new DataOutputStream(s.getOutputStream(); dos.writeUTF(Hello);连接连接请求请求I/O数数据流据流 前面的学习已经知道:前面的学习已经知道:accept()方法是个阻塞方法,方法是个阻塞方法,读取数据的方法读取数据的方法(如如readUTF()也是阻塞方法。也是阻塞方法。 问题:如果接收多客户连接,则必须问题:如果接收多客户连接,则必须while(true) System.out.println(等待建立连

17、接等待建立连接.); Socket connecttoClient=serversocket.accept();. 如果这样,使用单线程就不能接收客户端数据。如果这样,使用单线程就不能接收客户端数据。 解决:使用多线程。解决:使用多线程。while(true)System.out.println(等待建立连接等待建立连接.+count);Socket connecttoClient=serversocket.accept();System.out.println(建立连接成功建立连接成功!);ThreadConnection thread1=new ThreadConnection(conne

18、cttoClient,count);thread1.start();count+;解决:使用多线程。解决:使用多线程。见见MultiServerLx 0.3:设计客户端设计客户端 简单的窗口简单的窗口 添加文本框和文本区添加文本框和文本区 添加事件处理添加事件处理简单的窗口、添加文本框和文本区代码如下:简单的窗口、添加文本框和文本区代码如下:import java.awt.*;public class ChatClient extends Frame TextField tfTxt = new TextField();TextArea taContent = new TextArea();pu

19、blic static void main(String args) new ChatClient().launchFrame(); public void launchFrame() setLocation(400, 300);this.setSize(300, 300);add(tfTxt, BorderLayout.SOUTH);add(taContent, BorderLayout.NORTH);pack();setVisible(true);添加事件处理:添加事件处理:tfTxt.addActionListener(new TFListener();private class TFL

20、istener implements ActionListener public void actionPerformed(ActionEvent e) String s = tfTxt.getText().trim();taContent.setText(s);tfTxt.setText(); 0.3:继续设计服务器端继续设计服务器端 等待客户端的连接等待客户端的连接 连接建立后连接建立后,获得输入流连续接收客户获得输入流连续接收客户端传递的信息端传递的信息等待客户端的连接:等待客户端的连接:public class ChatServer public static void main(St

21、ring args) try ServerSocket ss = new ServerSocket(8888);while(true) Socket s = ss.accept();System.out.println(a client connected!); catch (IOException e) e.printStackTrace();客户端发送连接请求:客户端发送连接请求:public void connect() try s = new Socket(, 8888);System.out.println(connected!); catch (UnknownHo

22、stException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();连接建立后连接建立后,获得输入流连续接收客户端传获得输入流连续接收客户端传递的信息:递的信息:服务器端:服务器端:DataInputStream dis = new DataInputStream(s.getInputStream();String str = dis.readUTF();System.out.println(str);dis.close();try catch (EOFException e) System.out.pri

23、ntln(Client closed!); catch (IOException e) e.printStackTrace(); finally try if(dis != null) dis.close();if(s != null) s.close(); catch (IOException e1) e1.printStackTrace();问题:若客户端退出,抛出问题:若客户端退出,抛出EOFException 0.5 服务器接收多客户端的连接请求服务器接收多客户端的连接请求 因为因为readUTF()方法是一个阻塞方法方法是一个阻塞方法. 而而accept()也是一个阻塞方法也是一个阻塞方法,也就是说也就是说,该方法堵塞服务器端当前线程的执行该方法堵塞服务器端当前线程的执行,直直到有客户端请求建立套接字连接到有客户端请求建立套接字连接. 所以我们单独开辟一个线程处理单个客所以我们单独开辟一个线程处理单个客户端的数据传输户端的数据传输.该线程代码如下:该线程

温馨提示

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

评论

0/150

提交评论