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();
}
}
}
}
上一篇: 关于jquery.validate.js的使用心得
下一篇: CentOS上面的ICMP安全