黑马程序员--网络编程

------- android培训java培训、期待与您交流! ----------


网络编程

网络编程的目的:实现计算机之间的通信。


网络编程中的主要的问题:

要想让处于网络中的主机互相通信,只是知道通信双方地址还是不够的,还必须遵循一定的规则。有两套参考模型:

  1. OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广。
  2. TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

  • OSI七层模型:物理层、数据链路层,网络层,传输层,会话层,表示层,应用层。
  • TCP/IP五层协议: 物理层、数据链路层,网络层,传输层,应用层。

运输层协议中的两个重要协议:

  1. 传输控制协议TCP(Transmission Control Protocol):是面向连接的运输层协议。即应用进程(或程序)在使用TCP协议之前,必须先建立TCP连接,在传输完毕后,释放已经建立的连接。利用TCP协议进行通信的两个应用进程,一个是服务器进程。另一个是客户进程。
  2.  用户数据报协议UDP(UserDatagram Protocol):用户数据报协议UDP是面向无连接的运输层协议。应用进程(或程序)在使用UDP协议之前,不必先建立连接。所以结束时也没有连接需要释放。因此,减少了开销和发送数据之前的时延。

关于域名和IP地址:Internet上的主机有两种方式表示地址,域名和IP地址, 域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。
  • 域名:www.baidu.com
  • IP 地址:115.239.211.110

端口号:端口号是一个16 位的整数 0~65535。其中,0~1023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等)。除非我们需要访问这些特定服务,否则,就应该使用 1024~65535 这些端口中的某一个进行通信,以免发生端口冲突。


TCP程序设计:利用套接字(Socket)接口开发网络应用程序被广泛的采用,以至于成为事实上的标准。套接字能执行7种基本操作:

  1. 连接到远程主机
  2. 绑定到端口
  3. 接收从远程机器来的连接请求
  4. 监听到达的数据
  5. 发送数据
  6. 接收数据
  7. 关闭连接

客户端Socket的工作步骤:

  1. 创建 Socket。
  2. 打开连接到 Socket 的输入/出流。使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流。
  3. 按照一定的协议对 Socket  进行读/写操作。
  4. 关闭 Socket。断开客户端到服务器的连接,释放线路 

服务器程序的工作步骤:

  1. 调用ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口上
  2. 调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
  3. 调用Socket类的 getOutputStream 和getInputStream 获取输出流和输入流,开始网络数据的发送和接收。
  4. 最后关闭通信套接字。 

关于UDP:

类DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。DatagramPacket 对象封装了UDP数据报,在数据报中包含了客户端的IP地址和端口号以及服务器的IP地址和端口号。

UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。


URL编程:又叫做统一资源定位符,它表示 Internet 上某一资源的地址,通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。

URL的基本结构由5部分组成

<传输协议>://<主机名>:<端口号>/<文件名>

例如: http://192.168.1.100:8080/helloworld/index.jsp


InetAdress类:对象含有一Internet 主机地址的域名和IP地址。

public class  TestInntAddress{
	
	public static void main(String args[]) throws UnknownHostException {
		//获取黑马官网的域名和ip地址
		InetAddress inetAddress=InetAddress.getByName("www.itheima.com");
		System.out.println(inetAddress);//www.itheima.com/115.29.149.42
		
		//获取本地域名和ip地址
		InetAddress address=InetAddress.getLocalHost();
		System.out.println(address);//USER-89757/192.168.1.101
	}
}


利用socket和severSocket实现服务端向服务端发送文件代码.

package com.testDemo;

import java.io.*;
import java.net.*;
import org.junit.Test;

public class SeverCientTest {
	@Test
	public void startServer() throws IOException{
		Server server=new Server();
		server.sendFile();
	}
	
	@Test
	
	public void startClient() throws IOException{
		Client client=new Client();
		client.receiveFile();
	}
	
}

		//服务端
	class Server {
		public void sendFile() throws IOException {
			// 创建serversocket对象,端口号8889
			ServerSocket serverSocket = new ServerSocket(8889);
			// 接受客户端请求,并得到socket 对象
			Socket socket = serverSocket.accept();

			// 传输文档
			// 1.读取硬盘上文档
			InputStream in = new FileInputStream("三国演义.txt");
			InputStreamReader reader = new InputStreamReader(in);
			BufferedReader bufferedReader = new BufferedReader(reader);
			// 2.传到客户端
			OutputStream out = socket.getOutputStream();
			PrintWriter printWriter = new PrintWriter(out);

			String str = null;
			int i = 0;

			while ((str = bufferedReader.readLine()) != null) {
				if (i != 0) {
					printWriter.write("\n");
				}
				printWriter.write(str);
				i++;
			}
			// 关闭资源
			in.close();
			reader.close();
			bufferedReader.close();

			printWriter.close();
			out.close();

			socket.close();
			serverSocket.close();
		}
	}
//客户端
class Client {
	public void receiveFile() throws IOException {
		// 连接服务端主机
		InetAddress address = InetAddress.getByName("127.0.0.1");
		// 创建socket对象
		Socket socket = new Socket(address, 8889);
		// 接受服务端的信息
		InputStream in = socket.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(in));

		OutputStream out = new FileOutputStream("来自服务端的文件.txt");
		BufferedWriter bufferedWriter = new BufferedWriter(
				new OutputStreamWriter(out));

		//从输入流读取数据并写入硬盘
		String str;
		int i = 0;
		while ((str = reader.readLine()) != null) {
			if (i != 0)
				bufferedWriter.write("\n");
			bufferedWriter.write(str);
			i++;
		}
		// 关闭流资源
		bufferedWriter.close();
		out.close();

		in.close();
		reader.close();
		socket.close();
	}
}


------- android培训java培训、期待与您交流! ----------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值