欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP/IP协议

程序员文章站 2022-06-30 18:20:46
...

TCP/IP协议
ISO制定的osi参考模型的过于庞大、复杂招致了许多批评,技术人员自己开发的TCP/IP协议获得了更为广泛的应用
端口,就是应用程序用于数据交互的通道,用于实现程序间的通信,每个应用程序都有固定的端口
两个应用程=程序如果使用同一个端口,会抛出端口冲突异常
java.net.BindExcepton

Telnet协议 tel 23

简单邮件传输协议 smtp 25

文件传输协议 ftp 21

超文本传输协议 http 80

TCP协议

比较可靠的双向流协议
三次握手
提供消息确认,错误检测和错误恢复等服务,如果数据在传输中有损耗,有遗失,会要求发送方重新发送,从而保证数据完整性

UDP协议

比较不可靠,如果数据在传输中有损耗,不会要求重发,优点是速度快

html 超文本标记语言

以标记和子标记语言描述网页内容的语言,超文本的含义是,在html中描述的不仅仅是文本数据,还可以通过一系列的标记链接各式各样的网络资源(图片、音频、视频、css、js)
客户端在访问html页面中,不仅仅需要下载文本数据,而且还需要发出n个请求,将网页中的链接资源一一下载

volatile关键字

volatile是用于修饰属性和静态变量的关键字,volatile修饰的属性和静态变量具有以下特点:
1、当多个线程同时访问该变量时,在一个线程修改了该变量的值后,其他线程立即可见
2、禁止指令重写排列

			// 开启服务器,并开放8088端口
			ServerSocket s = new ServerSocket(8088);
			// 监听端口,如果有客户端连接到服务器,将连接信息封装成socket对象
			Socket socket = s.accept();
			// 从socket中得到读取流,用于接收客户端数据
			InputStream in = socket.getInputStream();
			// 从socket中得到写入流,用于将数据发送到客户端
			OutputStream out = socket.getOutputStream();
			
			//将读取流封装成请求对象,以便更好的接收数据
			Request request=new Request(in);
			
			//将写入流封装成响应对象,以便更好的发送数据
			Response response=new Response(out);
			//向客户端写入数据
			response.sendFile(request.getUrl());
			
			out.flush();

//===================================================
/**
 * 封装读取流的请求类
 * 
 * @author 10310
 *
 */
public class Request {
	
	/**封装客户端请求资源路径*/
	private String url;
	
	public Request(InputStream in) {
		try {
			// 读取客户端数据
			byte[] by = new byte[1024];
			in.read(by);
			String str = new String(by).trim();
			//拆分字符串
			String []array= str.split("\\s+");
			this.url=array[1].substring(1);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	public String getUrl() {
		return url;
	}

}
//===================================================
/**
 * 封装写入信息的响应类
 * @author 10310
 *
 */

public class Response {
	private OutputStream out;

	public Response(OutputStream out) {
		this.out = out;
	}

	/**
	 * 发送文本数据到客户端
	 * @param str 字符串
	 */
	public void sendMessage(String str) {
		try {
			out.write(str.getBytes());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 发送文件数据到客户端
	 * @param filePath
	 */
	public void sendFile(String filePath) {
		File file=new File(filePath);
		//文件不存在则跳出方法
		if (file.exists()==false) {
			return;
		}
		InputStream in=null;
		try {
			//建立服务器源文件的读取流
			in=new FileInputStream(filePath);
			int len = 0;
			byte[] by = new byte[1024*10];
			//循环读取文件数据发送给客户端
			while ((len = in.read(by)) != -1) {
				out.write(by, 0, len);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				//关闭流
				in.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}