基于TCP协议的网络编程之Socket(套接字)

一.什么是Socket?

  • 通信链路的端点就被称为套接字,英名文为’Socket’
  • 是提供给应用程序的接口,类似我们日常生活中的快递点
  • Socket的底层机制比较复杂,java平台提供了一些简单的API,可更简单有效的使用Socket开发而无需了解底层机制
  • 所在包为java.net包中

二.Socket通信模型

  • 1.基于TCP协议的Socket网络通信–>用来实现双向安全连接网络通信
  • 2.Socket通信模型
  • 进行网络通信时Socket需要借助数据流来完成数据的传递工作,如下:
    数据流传递

三.Socket编程步骤

  • 建立连接–>网络编程模型:客户端/服务器
  • 打开Socket关联的输入输出流
  • 数据流中读写信息
  • 关闭所有的数据流和Socket

客户端向服务端提交请求的交互过程

  • 1.Server端开放端口: ServerSocket ss=new ServerSocket(6000);
  • 2.Server端监听端口: Socket s=s = ss.accept();
  • 3.client端连接server端端口: Socket s = new Socket("127.0.0.1",6000);
  • 4.client端获取输出流–>在输出流中写入数据: OutputStream os = s.getOutputStream();
  • 5.server端监听到client端的数据传输,server端获取输入流–>读取输入流的数据: InputStream is = s.getInputStream();
  • 6.依次关闭client端和server的流和socket对象

四.demo:实现一个客户发出请求,服务端向客户端响应的交互过程

1)服务器端:

package net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author sunyong
 * @date 2020/06/21
 * @description
 * 服务端
 */
public class TestServer {
    public static void main(String[] args)throws Exception {
        while (true) {
            //1)开放端口
            ServerSocket ss = new ServerSocket(6000);
            System.out.println("服务器启动,等待客户端!");
            //2)监听端口
            Socket s = ss.accept();
            //3)获取输入流读取数据
            InputStream is = s.getInputStream();
            byte[] b = new byte[is.available()];
            is.read(b);
            char[] c = new char[b.length];
            for (int i = 0; i < b.length; i++) {
                c[i] = (char) b[i];
            }
            String rst = String.valueOf(c);
            System.out.println(rst);
            String a = "I am server";
            //4)获取输出流给与响应
            OutputStream os = s.getOutputStream();
            os.write(a.getBytes());
            //关闭输入输出流和socket
            os.close();
            is.close();
            s.close();
            ss.close();
        }

    }
}

2)客户端:

package net;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * @author sunyong
 * @date 2020/06/21
 * @description
 * 客户端
 */
public class TestClient {
    public static void main(String[] args) throws Exception {
        //1)通过服务器的ip和端口连接服务端
        Socket s = new Socket("127.0.0.1",6000);//连接本机 localhost或者127.0.0.1(本机回环地址)
        //2)获取输出流写数据
        OutputStream os = s.getOutputStream();
        String str ="hello,I am client No.1 for test";
        os.write(str.getBytes());
        //3)获取输入流读数据
        InputStream is = s.getInputStream();
        int temp;
        StringBuffer sb = new StringBuffer();
        while ((temp=is.read())!=-1){
            sb.append((char)temp);
        }
        System.out.println(sb.toString());
        //4)关闭流和socket
        is.close();
        os.close();
        s.close();
    }
}

五.交互效果如下:

  • 1.服务器端:
    在这里插入图片描述
  • 2.客户端:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/106886256