java知识总结(十三)网络编程
原文来自搬砖工,如需转载请注明出处 这篇文章简单总结1下java网络编程的相干知识 1、TCP和UDP 1.TCP(传输控制协议)方式 2、基于URL的网络编程 try{ URL myURL= new URL(…) }catch (MalformedURLException e){ … }2. 解析1个URL 1个URL对象生成后,其属性是不能被改变的,但是我们可以通过类URL所提供的方法来获得这些属性: public String getProtocol() 获得该URL的协议名。 public String getHost() 获得该URL的主机名。 public int getPort() 获得该URL的端口号,如果没有设置端口,返回⑴。 public String getFile() 获得该URL的文件名。 public String getRef() 获得该URL在文件中的相对位置。 public String getQuery() 获得该URL的查询信息。 public String getPath() 获得该URL的路径 public String getAuthority() 获得该URL的权限信息 public String getUserInfo() 取得使用者的信息 public String getRef()取得该URL的锚3.从URL读取WWW网络资源 当我们得到1个URL对象后,就能够通过它读取指定的WWW资源。这时候我们将使用URL的方法openStream(),其定义为: InputStream openStream(); 方法openSteam()与指定的URL建立连接并返回InputStream类的对象以从这1连接中读取数据。 URL url = new URL("http://www.baidu.com"); //使用openStream得到1输入流并由此构造1个BufferedReader对象 BufferedReader br = new BufferedReader(new InputStreamReader( url.openStream())); String line = null; while(null != (line = br.readLine())) { System.out.println(line); } br.close();3、客户端网络编程步骤 依照前面的基础知识介绍,不管使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成 1.客户端网络编程步骤 客户端(Client)是指网络编程中首先发起连接的程序,客户端1般实现程序界面和基本逻辑实现,在进行实际的客户端编程时,不管客户端复杂还是简单,和客户端实现的方式,客户真个编程主要由3个步骤实现: (1)建立网络连接 客户端网络编程的第1步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会构成1条虚拟的连接,后续的操作就能够通过该连接实现数据交换了。 (2) 交换数据 连接建立以后,就能够通过这个连接交换数据了。交换数据严格依照要求响应模型进行,由客户端发送1个要求数据到服务器,服务器反馈1个响应数据给客户端,如果客户端不发送要求则服务器端就不响应。 根据逻辑需要,可以屡次交换数据,但是还是必须遵守要求响应模型。 (3)关闭网络连接 在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。 最基本的步骤1般都是这3个步骤,在实际实现时,步骤2会出现重复,在进行代码组织时,由于网络编程是比较耗时的操作,所以1般开启专门的现场进行网络通讯。 2.服务器端网络编程步骤 服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端1般实现程序的核心逻辑和数据存储等核心功能。服务器真个编程步骤和客户端不同,是由4个步骤实现,顺次是: (1)监听端口 服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口便可。 这个端口就是服务器端开放给客户真个端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。 (2)取得连接 当客户端连接到服务器端时,服务器端就能够取得1个连接,这个连接包括客户真个信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。 1般在服务器端编程中,当取得连接时,需要开启专门的线程处理该连接,每一个连接都由独立的线程实现。 (3)交换数据 服务器端通过取得的连接进行数据交换。服务器真个数据交换步骤是首先接收客户端发送过来的数据,然落后行逻辑处理,再把处理以后的结果数据发送给客户端。简单来讲,就是先接收再发送,这个和客户真个数据交换数序不同。 其实,服务器端取得的连接和客户端连接是1样的,只是数据交换的步骤不同。 固然,服务器真个数据交换也是可以屡次进行的。 在数据交换完成以后,关闭和客户真个连接。 (4)关闭连接 当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口和占用的内存可以释放出来,实现了连接的关闭。 4、InetAddress 该类的功能是代表1个IP地址,并且将IP地址和域名相干的操作方法包括在该类的内部。 import java.net.InetAddress; public class InetAddressDemo { public static void main(String[] args) { try { // 使用域名创建对象 InetAddress inet1 = InetAddress.getByName("www.163.com"); System.out.println(inet1); // 使用IP创建对象 InetAddress inet2 = InetAddress.getByName("127.0.0.1"); System.out.println(inet2); // 取得本机地址对象 InetAddress inet3 = InetAddress.getLocalHost(); System.out.println(inet3); // 取得对象中存储的域名 String host = inet3.getHostName(); System.out.println("域名:" + host); // 取得对象中存储的IP String ip = inet3.getHostAddress(); System.out.println("IP:" + ip); } catch (Exception e) { } } }注:InetAddress 类没有明显的构造函数。为生成1个InetAddress对象,必须应用1个可用的工厂方法。 –工厂方法(factory method)仅是1个类中静态方法返回1个该类实例的约定。对InetAddress,3个方法 getLocalHost( )、getByName( )和getAllByName( )可以用来创建InetAddress的实例 如果这些方法不能解析主机名,它们引发1个UnknownHostException异常。 务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口和占用的内存可以释放出来,实现了连接的关闭。 5、TCP编程 在Java语言中,对TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就能够建立连接了。 客户端 服务器端 import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Constants { 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.accept(); // 接收客户端发送内容 is = socket.getInputStream(); byte[] b = new byte[1024]; int n = is.read(b); // 输出 System.out.println("客户端发送内容为:" + new String(b,n)); // 向客户端发送反馈内容 os = socket.getOutputStream(); os.write(b,n); } catch (Exception e) { e.printStackTrace(); } finally { try { // 关闭流和连接 os.close(); is.close(); socket.close(); serverSocket.close(); } catch (Exception e) { } } } }6、UDP编程 UDP(User Datagram Protocol),中文意思是用户数据报协议使用该种方式无需建立专用的虚拟连接,由于无需建立专用的连接,所以对服务器的压力要比TCP小很多,所以也是1种常见的网络编程方式。但是使用该种方式最大的不足是传输不可靠,固然也不是说常常丢失,就像大家发短信息1样,理论上存在收不到的可能 String s = "Hello"; String host = "127.0.0.1"; int port = 10001; //将发送的内容转换为byte数组 byte[] b = s.getBytes(); //将服务器IP转换为InetAddress对象 InetAddress server = InetAddress.getByName(host); //构造发送的数据包对象 DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port); //发送数据 ds.send(sendDp);在该示例代码中,不管发送的数据内容是甚么,都需要转换为byte数组,然后将服务器真个IP地址构造成InetAddress类型的对象,在准备完成以后,将这些信息构造成1个DatagramPacket类型的对象,在UDP编程中,发送的数据内容、服务器真个IP和端口号,都包括在DatagramPacket对象中。在准备完成以后,调用连接对象ds的send方法把DatagramPacket对象发送出去便可。 3)UDP客户端编程中接收数据 首先构造1个数据缓冲数组,该数组用于存储接收的服务器端反馈数据,该数组的长度必须大于或等于服务器端反馈的实际有效数据的长度。然后以该缓冲数组为基础构造1个DatagramPacket数据包对象,最后调用连接对象的receive方法接收数据便可。接收到的服务器端反馈数据存储在DatagramPacket类型的对象内部 示例代码: //构造缓冲数组 byte[] data = new byte[1024]; //构造数据包对象 DatagramPacket receiveDp = new DatagramPacket(data,data.length); //接收数据 ds.receive(receiveDp); //输出数据内容 byte[] b = receiveDp.getData(); //取得缓冲数组 int len = receiveDp.getLength(); //取得有效数据长度 String s = new String(b,len); System.out.println(s);代码讲授 :首先构造缓冲数组data,这里设置的长度1024是预估的接收到的数据长度,要求该长度必须大于或等于接收到的数据长度,然后以该缓冲数组为基础,构造数据包对象,使用连接对象ds的receive方法接收反馈数据,由于在Java语言中,除String之外的其它对象都是依照地址传递,所以在receive方法内部可以改变数据包对象receiveDp的内容,这里的receiveDp的功能和返回值类似。数据接收到以后,只需要从数据包对象中读取出来就能够了,使用DatagramPacket对象中的getData方法可以取得数据包对象的缓冲区数组,但是缓冲区数组的长度1般大于有效数据的长度,换句话说,也就是缓冲区数组中只有1部份数据是反馈数据,所以需要使用DatagramPacket对象中的getLength方法取得有效数据的长度,则有效数据就是缓冲数组中的前有效数据长度个内容,这些才是真实的服务器端反馈的数据的内容 4)关闭连接 ds.close(); UDP方式服务器端网络编程 1)首先UDP方式服务器端网络编程需要建立1个连接,该连接监听某个端口: DatagramSocket ds = new DatagramSocket(10010); 由于服务器真个端口需要固定,所以1般在建立服务器端连接时,都指定端口号 2)接收客户端发送过来的数据 其接收的方法和客户端接收的方法1直,其中receive方法的作用类似于TCP方式中accept方法的作用,该方法也是1个阻塞方法,其作用是接收数据。 ds.receive() 接收到客户端发送过来的数据以后,服务器端对该数据进行逻辑处理,然后将处理以后的结果再发送给客户端,在这里发送时就比客户端要麻烦1些,由于服务器端需要取得客户真个IP和客户端使用的端口号,这个都可以从接收到的数据包中取得。示例代码以下: //取得客户真个IP InetAddress clientIP = receiveDp.getAddress(); //取得客户真个端口号 Int clientPort = receiveDp.getPort();3)关闭连接 ds.close() ps:总结的不是很全面,但很基础,应当合适初学者学习,由于本人也是初学者的小菜鸟,所有很多东西可能都触及不到,希望大家见谅! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |