黑马程序员——网络编程

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! -------------------------

     网络编程(狭义):在两个或两个以上的设备(例如计算机)之间传输数据;程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据。

一:网络通讯方式

在现有的网络中,网络通讯的方式主要有两种:

1、 TCP(传输控制协议)方式

TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠数据传输,如果数据发送失败,则客户端会自动重发该数据。

2、 UDP(用户数据报协议)方式

UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也是很可靠,如果发送失败则客户端无法获得

UDPTCP协议的区别


二:基于url的网络编程

1.创建一个URL

    为了表示URL java.net中实现了类URL。我们可以通过如下的构造方法等来初始化一个URL对象(只显示出部分构造函数,其他可以参考java api
  1URL(String spec) 
       根据 String 表示形式创建 URL 对象。 

  1. URL url = new URL("http://www.baidu.com");  
URL url = new URL("http://www.baidu.com");

    2、URL(String protocol, String host, int port, String file) 
       根据指定 protocolhostport 号和 file 创建 URL 对象。

  1. URL url = new URL("http""www.gamelan.com""/pages/Gamelan.net. html");  
 URL url = new URL("http", "www.gamelan.com", "/pages/Gamelan.net. html");

2. 解析一个URL

    一个URL对象生成后,其属性不能被改变的,但是我们可以通过类URL所提供的方法来获取这些属性

     public String getProtocol() 获取该URL协议名

   public String getHost() 获取该URL主机名

   public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1

   public String getFile() 获取该URL文件名

   public String getRef() 获取该URL在文件中的相对位置

   public String getPath() 获取该URL路径

三.URL读取WWW网络资源

    当得到一个URL对象后,就可以通过它读取指定的WWW资源。这时我们将使用URL的方法openStream(),其定义为:
InputStream openStream();
  方法openSteam()与指定的URL建立连接并返回InputStream类的对象以从这一连接中读取数据

  1.  URL url = new URL("http://www.baidu.com");  
  2. // 使用openStream得到一输入流并由此构造一个BufferedReader对象   
  3. BufferedReader br = new BufferedReader(new InputStreamReader(  
  4.         url.openStream()));  
  5. String line = null;  
  6. while (null != (line = br.readLine())) {  
  7.     System.out.println(line);  
  8. }  
  9. br.close();  
   URL url = new URL("http://www.baidu.com");
		// 使用openStream得到一输入流并由此构造一个BufferedReader对象
		BufferedReader br = new BufferedReader(new InputStreamReader(
				url.openStream()));
		String line = null;
		while (null != (line = br.readLine())) {
			System.out.println(line);
		}
		br.close();

四:基础类:InetAddress

      该类的功能是代表一个IP地址,并且将IP地址和域名相关操作方法包含在该类的内部。

      InetAddress 类没有明显的构造函数,为生成一个InetAddress对象,必须运用一个可以返回一个该类实例的静态类。对于InetAddress,三个方法 getLocalHost( )getByName( )getAllByName( )可以用来创建InetAddress的实例 

      InetAddress运用:     

  1. public class InetAddressDemo {  
  2.   
  3.     public static void main(String[] args) {  
  4.   
  5.         try {  
  6.             // 使用域名创建对象   
  7.             InetAddress inet = InetAddress.getByName("www.163.com");  
  8.             // 获取IP地址   
  9.             System.out.println(inet.getHostAddress());  
  10.             // 获取主机名   
  11.             System.out.println(inet.getHostName());  
  12.   
  13.         } catch (Exception e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17. }  
public class InetAddressDemo {

	public static void main(String[] args) {

		try {
			// 使用域名创建对象
			InetAddress inet = InetAddress.getByName("www.163.com");
			// 获取IP地址
			System.out.println(inet.getHostAddress());
			// 获取主机名
			System.out.println(inet.getHostName());

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        其中:DNS域名解析:当我们访问localhost时,因为自己本机上配置了127.0.0.1,所以就访问本机的,如果本机上没配置,就会去访问局域网广域网上DNS服务器上的数据找到IP地址,然后返回给浏览器再接着访问服务器。

UDP编程

      在Java API中,实现UDP方式的编程,包含客户端网络编程服务器端网络编程,主要由两个类实现,分别是:

DatagramSocket此类表示用来发送和接收数据报包的套接字。简单的说就是DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。

DatagramPacket此类表示数据报包。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象

UDP发送端:

  1. public class InetAddressDemo {  
  2.   
  3.     public static void main(String[] args) throws IOException{  
  4.         /* 
  5.          * 创建UDP传输的发送端。  
  6.          * 思路:  
  7.          * 1,建立udp的socket服务。  
  8.          * 2,将要发送的数据封装到数据包中。 
  9.          * 3,通过udp的socket服务将数据包发送出去。 
  10.          * 4,关闭socket服务。 
  11.          */  
  12.         // 1,udpsocket服务。使用DatagramSocket对象。   
  13.         DatagramSocket ds = new DatagramSocket(8888);  
  14.         // 2,将要发送的数据封装到数据包中。   
  15.         String str = "udp传输演示数据!";  
  16.         // 使用DatagramPacket将数据封装到的该对象包中。   
  17.         byte[] buf = str.getBytes();  
  18.         DatagramPacket dp = new DatagramPacket(buf, buf.length,  
  19.                 InetAddress.getByName("192.168.1.118"), 10000);  
  20.         // 3,通过udp的socket服务将数据包发送出去。使用send方法。   
  21.         ds.send(dp);  
  22.         // 4,关闭资源。   
  23.         ds.close();  
  24.     }  
  25. }  
public class InetAddressDemo {

	public static void main(String[] args) throws IOException{
		/*
		 * 创建UDP传输的发送端。 
		 * 思路: 
		 * 1,建立udp的socket服务。 
		 * 2,将要发送的数据封装到数据包中。
		 * 3,通过udp的socket服务将数据包发送出去。
		 * 4,关闭socket服务。
		 */
		// 1,udpsocket服务。使用DatagramSocket对象。
		DatagramSocket ds = new DatagramSocket(8888);
		// 2,将要发送的数据封装到数据包中。
		String str = "udp传输演示数据!";
		// 使用DatagramPacket将数据封装到的该对象包中。
		byte[] buf = str.getBytes();
		DatagramPacket dp = new DatagramPacket(buf, buf.length,
				InetAddress.getByName("192.168.1.118"), 10000);
		// 3,通过udp的socket服务将数据包发送出去。使用send方法。
		ds.send(dp);
		// 4,关闭资源。
		ds.close();
	}
}

UDP接收端:

  1. public class UDPReceDemo {  
  2.   
  3.     public static void main(String[] args) throws IOException {  
  4.         /* 
  5.          * 建立UDP接收端的思路。 
  6.          * 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。 
  7.          * 2,创建数据包用于存储接收到的数据。方便用数据包对象的方法解析这些数据. 
  8.          * 3,使用socket服务的receive方法将接收的数据存储到数据包中。  
  9.          * 4,通过数据包的方法解析数据包中的数据。  
  10.          * 5,关闭资源 
  11.          */  
  12.         // 1,建立udp socket服务。   
  13.         DatagramSocket ds = new DatagramSocket(10000);  
  14.         // 2,创建数据包。   
  15.         byte[] buf = new byte[1024];  
  16.         DatagramPacket dp = new DatagramPacket(buf, buf.length);  
  17.         // 3,使用接收方法将数据存储到数据包中。   
  18.         ds.receive(dp);// 阻塞式的。   
  19.         // 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。   
  20.         String ip = dp.getAddress().getHostAddress();  
  21.         int port = dp.getPort();  
  22.         String text = new String(dp.getData(), 0, dp.getLength());  
  23.         System.out.println(ip + ":" + port + ":" + text);  
  24.         // 5,关闭资源。   
  25.         ds.close();  
  26.     }  
  27. }  
public class UDPReceDemo {

	public static void main(String[] args) throws IOException {
		/*
		 * 建立UDP接收端的思路。
		 * 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
		 * 2,创建数据包用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
		 * 3,使用socket服务的receive方法将接收的数据存储到数据包中。 
		 * 4,通过数据包的方法解析数据包中的数据。 
		 * 5,关闭资源
		 */
		// 1,建立udp socket服务。
		DatagramSocket ds = new DatagramSocket(10000);
		// 2,创建数据包。
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, buf.length);
		// 3,使用接收方法将数据存储到数据包中。
		ds.receive(dp);// 阻塞式的。
		// 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
		String ip = dp.getAddress().getHostAddress();
		int port = dp.getPort();
		String text = new String(dp.getData(), 0, dp.getLength());
		System.out.println(ip + ":" + port + ":" + text);
		// 5,关闭资源。
		ds.close();
	}
}


 

TCP编程

    Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接

       客户端:

  1. public class TCPClient {  
  2.     public static void main(String[] args) throws IOException,  
  3.             ClassNotFoundException {  
  4.         // 客户端发数据到服务端   
  5.         /* 
  6.          * Tcp传输,客户端建立的过程。  
  7.          * 1,创建tcp客户端socket服务。使用的是Socket对象。 
  8.          * 建议该对象一创建就明确目的地。要连接的主机。 
  9.          *  2,如果连接建立成功,说明数据传输通道已建立。 该通道就是socket流 ,是底层建立好的。 
  10.          * 既然是流,说明这里既有输入, 又有输出。 想要输入或者输出流对象,可以找Socket来获取。 
  11.          * 可以通过getOutputStream(),和getInputStream()来获取两个字节流。  
  12.          * 3,使用输出流,将数据写出。 
  13.          * 4,关闭资源。 
  14.          */  
  15.         Socket s = new Socket("192.168.1.110"10002);  
  16.         OutputStream out = s.getOutputStream();  
  17.         out.write("TCP演示数据".getBytes());  
  18.         // 读取服务端返回的数据,使用socket读取流。   
  19.         InputStream in = s.getInputStream();  
  20.         byte[] buf = new byte[1024];  
  21.           
  22.         int len = in.read(buf);  
  23.         System.out.println(new String(buf, 0, len));  
  24.         out.close();  
  25.         in.close();  
  26.         s.close();  
  27.     }  
  28. }  
public class TCPClient {
	public static void main(String[] args) throws IOException,
			ClassNotFoundException {
		// 客户端发数据到服务端
		/*
		 * Tcp传输,客户端建立的过程。 
		 * 1,创建tcp客户端socket服务。使用的是Socket对象。
		 * 建议该对象一创建就明确目的地。要连接的主机。
		 *  2,如果连接建立成功,说明数据传输通道已建立。 该通道就是socket流 ,是底层建立好的。
		 * 既然是流,说明这里既有输入, 又有输出。 想要输入或者输出流对象,可以找Socket来获取。
		 * 可以通过getOutputStream(),和getInputStream()来获取两个字节流。 
		 * 3,使用输出流,将数据写出。
		 * 4,关闭资源。
		 */
		Socket s = new Socket("192.168.1.110", 10002);
		OutputStream out = s.getOutputStream();
		out.write("TCP演示数据".getBytes());
		// 读取服务端返回的数据,使用socket读取流。
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];
		
		int len = in.read(buf);
		System.out.println(new String(buf, 0, len));
        out.close();
        in.close();
		s.close();
	}
}

服务端:

  1. public class TCPServer {  
  2.     public static void main(String[] args) throws IOException,  
  3.             ClassNotFoundException {  
  4.         /* 
  5.          * 建立tcp服务端的思路: 
  6.          * 1,创建服务端socket服务。通过ServerSocket对象。 
  7.          * 2,服务端必须对外提供一个端口,否则客户端无法连接。  
  8.          * 3,获取连接过来的客户端对象。 
  9.          * 4,通过客户端对象获取socket流读取客户端发来的数据,并打印在控制台上。 
  10.          * 5,关闭资源。关客户端,关服务端。 
  11.          */  
  12.         // 监听端口号   
  13.         int port = 10002;  
  14.         // 建立连接   
  15.         ServerSocket serverSocket = new ServerSocket(port);  
  16.         // 获得连接   
  17.         Socket s = serverSocket.accept();  
  18.         // 接收客户端发送内容   
  19.         InputStream in = s.getInputStream();  
  20.         String ip = s.getInetAddress().getHostAddress();  
  21.         byte[] buf = new byte[1024];  
  22.         int len = in.read(buf);  
  23.         String text = new String(buf, 0, len);  
  24.         System.out.println(ip + "---" + text);  
  25.         // 使用客户端socket对象的输出流给客户端返回数据   
  26.         OutputStream out = s.getOutputStream();  
  27.         out.write("收到数据".getBytes());  
  28.         // 关闭资源   
  29.         in.close();  
  30.         out.close();  
  31.         s.close();  
  32.         serverSocket.close();  
  33.     }  
  34. }  
public class TCPServer {
	public static void main(String[] args) throws IOException,
			ClassNotFoundException {
		/*
		 * 建立tcp服务端的思路:
		 * 1,创建服务端socket服务。通过ServerSocket对象。
		 * 2,服务端必须对外提供一个端口,否则客户端无法连接。 
		 * 3,获取连接过来的客户端对象。
		 * 4,通过客户端对象获取socket流读取客户端发来的数据,并打印在控制台上。
		 * 5,关闭资源。关客户端,关服务端。
		 */
		// 监听端口号
		int port = 10002;
		// 建立连接
		ServerSocket serverSocket = new ServerSocket(port);
		// 获得连接
		Socket s = serverSocket.accept();
		// 接收客户端发送内容
		InputStream in = s.getInputStream();
		String ip = s.getInetAddress().getHostAddress();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		String text = new String(buf, 0, len);
		System.out.println(ip + "---" + text);
		// 使用客户端socket对象的输出流给客户端返回数据
		OutputStream out = s.getOutputStream();
		out.write("收到数据".getBytes());
		// 关闭资源
		in.close();
		out.close();
		s.close();
		serverSocket.close();
	}
}



 


 

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! -------------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值