Java学习笔记七

立足之处,方显深!

今日所讲内容:
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.双缓冲技术:所谓的双缓冲技术就是将操作复制,将复制后的操作存储到内存对象中,再次使用到之前的操作时,直接拿出内存对象就可以。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值