立足之处,方显深!
今日所讲内容:
1、应用程序协议和网络通信协议
2、Socket的简单使用
一、应用程序协议和网络通信协议。
1.网络通信协议,我的理解就是设备(主机、路由器等)通过网络之间传递数据前所要遵循的规则。例,TCP/IP。
2.应用程序协议,是指同一体系的应用程序(相同的应用程序、C/S模式的程序)之间在传递数据之前要遵循的规则,也就是就数据如何包装处理。例,1超文本传输协议HTTP: 2文件传送协议FTP: 等等。
解释:
当我们要从A主机的应用程序向B主机的应用程序发送数据data1时,首先要将data1在A主机的应用程序上通过这类应用程序的应用程序协议包装data1,此时数据data1变成了data2,然后再将data2按照网络通信协议的规则再次包装成data3,然后发送出去。 B主机按照网络通信协议的规则接受data3后,data3又变成data2,在B主机的应用程序上将data2按照这类应用程序的应用程序协议解析data2,最后把data2变成data1。
也就是说应用程序协议是基于网络通信协议的。
二、Socket的简单使用
1.Socket中不管是输入流还是输出流被关闭则Socket就会自动关闭。
2.服务端ServerSocket,客户端Socket。
3.阻塞式方法,accept(), readLine()。
解释:
服务端:
public class SocketTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket ss = new ServerSocket(8808);//实例化服务端并监听端口为8808的断开
Socket sc = ss.accept();//接受来自客户端的请求
BufferedReader br= new BufferedReader(new InputStreamReader(sc.getInputStream()));
BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(sc.getOutputStream()));
System.out.println("服务器接受来自客户端的消息:"+br.readLine());
bw.write("我是服务器");
bw.newLine();
bw.flush();
/*因为这里流关闭了所以socket不用再次关闭*/
br.close();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
public class SocketTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try(Socket sc = new Socket("192.168.0.105", 8808);//指定要连接的服务器的IP和端口。
BufferedReader br= new BufferedReader(new InputStreamReader(sc.getInputStream()));
BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(sc.getOutputStream()));) {
bw.write("我是客户端");
bw.newLine();
bw.flush();
System.out.println("客户端接受来自服务器的消息:"+br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果:
客户端接受来自服务器的消息:我是服务器
服务器接受来自客户端的消息:我是客户端
“Socket中不管是输入流还是输出流被关闭则Socket就会自动关闭。”我的理解是,Socket是基于流的方式进行通信的,如果流被关闭了,那么Socket就没有存在的必要了,所以会自动关闭。
所谓阻塞式的方法就是等待所需要的数据到来,在程序中的accept()和readLine()方法都是阻塞式的,accept()会一直等待Socket的连接,如果没有Socket连接,就是一直停在这里等待。readLine()方法就是读取流中的数据,如果流中没有数据(注意 结束符 也算数据)就会在这里一直等待。
小知识点:
1.readLine()方法: 阻塞式方法,遇到终止符(-1)、数据流发生异
常或者另一端被close()掉时,才会返回null值。
2.本地回环地址:127.0.0.1。发送给IP为127.0.0.1的数据不经过网卡。
3.使用start命令打开命令行是完全继承打开它的命令行的环境。
4.双缓冲技术:所谓的双缓冲技术就是将操作复制,将复制后的操作存储到内存对象中,再次使用到之前的操作时,直接拿出内存对象就可以。