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

来源:互联网 发布:复杂网络的小世界特性 编辑:程序博客网 时间:2024/05/23 12:52

内容简介

1 进程间的通信。
2 socket是什么以及在通信的作用。
3 socket通信实例。
4 socket源码浅析客户端和服务器端的连接过程。
5 socket在TCP三次握手中的建立连接过程。
6 socket在TCP四次挥手中的释放过程。

1 进程间的通信

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

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

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

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

3 socket通信实例

客户端代码
/** * 创建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
参考书籍:计算机网络-谢希仁第五版

原创粉丝点击