javase基础复习攻略《十》
按照计划本篇为大家总结JAVA的网络编程,什么叫网络编程呢?网络编程!=网站编程,对于这一点大家一定要注意,很多小朋友都曾经这么认为。既然谈到网络编程,咱们先了解一下网络的基础知识,什么是计算机网络?把分布在不同区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网络系统,从而使众多计算机可以方便的互相传递信息,共享硬盘、软件、数据信息等资源。
什么是网络通信协议:计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
网络通信接口:为了是两个节点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能够进行信息交换。接口包括两类:硬件装置——实现结点之间的信息传送。软件装置——规定双方进行通信的约定协议。
1、网络分层的参考模型:
2、TCP协议和UDP协议:
TCP是专门设计用于在不可靠的网络环境下提供可靠的、端到端的字节流通信协议。它是一种面向连接的协议。
UDP向应用程序提供一种发送封装的原始IP数据报的方法,并且发送时无须建立连接。是一种不可靠的连接协议。
3、TCP编程:
a、服务器端:
public class TestSeriver { /**服务器端 * @param args */ public static void main(String[] args) { try { //我们的机器上一个有65526个端口,在我们设置端口时,尽量选择124以后的端口,因为124之前的端口已经被特定的程序设置,例如:80 :浏览器地址端口 ServerSocket ss = new ServerSocket(888);//这里的888:是我们为了方便客户端的连接设置的端口号 Socket s = ss.accept();//用来接收客户端的的连接,注意这个方法是阻塞式的,也就是说如果没有客户端连接,程序将会停留在这个位置 System.out.println("A client connect!"); } catch (IOException e) { e.printStackTrace(); } } }
a、客户端:
public class TestClient { /**客户端 * @param args */ public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1",888);//在这里说明一点,"127.0.0.1":使我们的主机号,888:是我们需要连接的端口号 } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
b、服务器端:
public class TestSeriver1 { /**服务器端 * @param args */ public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(999); while(true){ Socket s = ss.accept(); System.out.println("A client connect!"); InputStream is = s.getInputStream(); DataInputStream dis = new DataInputStream(is); System.out.println(dis.readUTF());//这里的readUTF()方法也是阻塞式的,为了让看到这个效果我在客户端输入的地方添加了一个停顿,已经标注 } } catch (IOException e) { e.printStackTrace(); } } }
b、客户端:
public class TestClient1 { /**客户端 * @param args */ public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1", 999); OutputStream os = s.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); Thread.sleep(3000);//设置停顿三秒钟,关于这个我在线程的博客里有说明 dos.writeUTF("Hello Server!"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4、UDP编程实例:
a、服务器端:
public class TestUDPServer { /**服务器端代码 * @param args * 对于UDP和TCP的端口号,首先我们可以任意设置,但必须保证范围在65536以内 * UDP和TCP的端口号没有关联,也就是说,UDP和TCP各有65536个端口 */ public static void main(String[] args) throws Exception{ byte [] buf = new byte[1024];//设置存放数据的字符数组 DatagramPacket dp = new DatagramPacket(buf, buf.length); DatagramSocket ds = new DatagramSocket(5888);//设置端口号 while(true){ ds.receive(dp);//接收客户端发过来的请求数据 System.out.println(new String(buf, 0, dp.getLength())); //new String(buf, 0, dp.getLength()):String的构造方法,把一个字节数组转化为一个String类数据 } } }
a、客户端:
public class TestUDPClient { /**客户端代码实例 * @param args * SocketAddress:网络上的地址,不但包括IP,还包括端口号等等 * InetAddress:IP地址的超级 * InetSocketAddress:IP地址+端口号 */ public static void main(String[] args) throws Exception{ byte [] buf = new byte[1024]; buf = (new String("Hello")).getBytes();//将String类型的数据转换为字符数组 DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1",5888)); DatagramSocket ds = new DatagramSocket(9999);//设置客户端发送数据的端口号 ds.send(dp);//向服务器发送数据 ds.close(); } }
b、服务器端:
public class TestUDPServer1 { public static void main(String[] args) throws Exception{ byte [] buf = new byte[1024];//设置存放数据的字符数组 DatagramPacket dp = new DatagramPacket(buf, buf.length); DatagramSocket ds = new DatagramSocket(5888);//设置端口号 while(true){ ds.receive(dp);//接收客户端发过来的请求数据 ByteArrayInputStream bais = new ByteArrayInputStream(buf); DataInputStream dis = new DataInputStream(bais); System.out.println(dis.readLong()); } } }
b、客户端:
public class TestUDPClient1 { public static void main(String[] args) throws Exception{ Long L = 10000L; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos);//DataOutputStream:可以直接写一个Long类型的数据 dos.writeLong(L); byte [] buf = baos.toByteArray(); DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1",5888)); DatagramSocket ds = new DatagramSocket(9999);//设置客户端发送数据的端口号 ds.send(dp);//向服务器发送数据 ds.close(); } }
好了,到这里就为大家把JAVA中的网络编程总结完毕。
到今天对于JAVASE基础知识的总结就为大家分析完毕,一定存在一些问题,还望大家多多指点,再接下来的日子里,我还为大家分享JSP、JAVA SSH框架以及Android方面的基础知识总结,我一直相信,只有把基础打牢,才能走的更远,让我们一起加油吧。大家如果有什么好的理念,还望对的指点。