Socket浅析通信原理和java编程(一)

1进程间的通信

(1)本地的通信方式:
消息传递:管道、FIFO、消息队列。
同步:互斥量、条件变量、读写锁、文件和写记录锁、信号量。
共享内存:匿名的和具名的。
远程过程调用:Solaris门和Sun RPC。
(2)系统调用机制:系统调用机制是应用程序和操作系统之间传递控制权。
(3)应用程序如果需要使用系统的服务,需要将控制权从应用程序传递给系统调用接口,系统调用接口将控制权传递给操作系统,操作系统根据系统的调用函数去选择相应的操作系统服务,然后将控制权返回给应用程序,这样应用程序就可能使用操作系统的服务。

这里写图片描述
(4)思考:系统知道应用进程需要什么样的服务,但是系统如何知道是那个应用请求这个服务呢?

2socket是什么以及在通信的作用

1 那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。
2 网络五层模型:
应用层:http
传输层:tcp/ip。segment(数据段)
网络层:packet(数据包)
链路层:frame(数据帧)
物理层:比特
这里写图片描述
在套接字以上的控制权受应用程序的控制,在套接字以下的协议则受操作系统控制的。因此只要应用程序使用TCP/IP协议进行通信,就必须通过套接字与操作系统进行交互。
(3)从操作系统层面理解socket作用
套接字是为了获得网络通信服务而与操作系统进行交互时使用的一种机制。当某个应用进程进行想使用网络进行通信时,首先需要发出socket系统调用,请求操作系统为其创造一个socket套接字。这个调用实际上是操作系统去准备应用进程所需要的一些系统资源(存储空间、CPU、网络带宽等)分配给操作系统(进程是系统资源分配的单位)。操作系统将这些资源的总和(叫做套接字描述符)返回给应用进程。此后应用进程只要需要进行网络通信(建立连接、收发数据、调整网络通信参数等)都必须使用这个套接字描述符。在处理系统调用的时候,通过套接字描述符,操作系统就可以识别出应该准备那些资源来完成应用进程所请求的服务。通信完毕后,应用进程关闭套接字,系统会回收所有分配给应用进程的资源。

3socket通信实例

客户端代码
/**
 * 创建Socket对象,指明需要连接的服务器的地址和端口号
 * 连接建立后,通过输出流想服务器端发送请求信息   
 * 通过输入流获取服务器响应的信息
 * 关闭响应资源
 * author dan.wang
 */
public class Recv {
    public static void main(String[] args) throws Exception {
        // 客户端
        // 1、创建客户端Socket,指定服务器地址和端口
        Socket socket = new Socket("localhost", 10086);
        // 2、获取输出流,向服务器端发送信息
        OutputStream os = socket.getOutputStream();// 字节输出流
        PrintWriter pw = new PrintWriter(os);// 将输出流包装成打印流
        pw.write("用户名:admin;密码:123");
        pw.write("用户名:123;密码:123");
        pw.flush();
        socket.shutdownOutput();
        // 3、获取输入流,并读取服务器端的响应信息
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String info = null;
        while ((info = br.readLine()) != null) {
            System.out.println("我是客户端,服务器说:" + info);
        }

        // 4、关闭资源
        br.close();
        is.close();
        pw.close();
        os.close();
        socket.close();
    }
服务器端代码
/**
 * 创建ServerSocket对象,
 * 绑定监听端口,通过accept()方法监听客户端请求
 * 连接建立后,通过输入流读取客户端发送的请求信息
 * 通过输出流向客户端发送乡音信息 
 * 关闭相关资源
 * 
 * @author dan.wang
 *
 */
public class Send {
    public static void main(String[] args) throws Exception {
        /**
         * 基于TCP协议的Socket通信,实现用户登录,服务端
         */
        // 1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
        ServerSocket serverSocket = new ServerSocket(10086);// 1024-65535的某个端口
        // 2、调用accept()方法开始监听,等待客户端的连接
        Socket socket = serverSocket.accept();
        // 3、获取输入流,并读取客户端信息
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String info = null;
        while ((info = br.readLine()) != null) {
            System.out.println("我是服务器,客户端说:" + info);
        }
        socket.shutdownInput();// 关闭输入流
        // 4、获取输出流,响应客户端的请求
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.write("欢迎您!");
        pw.flush();

        // 5、关闭资源
        pw.close();
        os.close();
        br.close();
        isr.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

参考博客地址:
http://blog.csdn.net/jiajia4336/article/details/8798421
http://www.cnblogs.com/rocomp/p/4790340.html
参考书籍:计算机网络-谢希仁第五版

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值