TCP/IP以及Socket对象基本

1 OSI七层模型概念介绍

物理层:数据以比特的方式进行传递,典型的设备是集线器。该层主要规定了设备的电压或者端口等等一些列物理层面上的规定
    数据链路层:该层数据以帧的方式进行传递,主要是两个相邻的结点之间的数据传递,典型的设备就是交换机
    网络层:网络层顾名思义就是计算机网络之间的数据传递,包括子网之间。数据以包的方式传递。网络之间的路由规则等。典型的设备是路由器
    传输层:该层负责端设备之间的数据传递,以可靠的形式或者不可靠的形式传递。信息的传递是报文
    会话层:会话层负责进程之间的连接等一系列维护。数据的传递也是报文的形式
    表示层:表示层会对数据进行处理。比如加密操作,或者压缩或者格式转化等等
    应用层:确定数据的实际用途
2 TCP/IP协议
 
应用层 FTP  Telnet  HTTP        SNMP              DNS
传输层             TCP                     UDP
网络互联层                                       IP

主机-网络层
以太网:IEEE802.3
令牌环网:IEEE802.4
3 Echo(客户端-服务端)模型
客户端流程


客户端代码

package com.asiaInfo.caozg.ch_01;

import java.io.*;
import java.net.Socket;

/**
 * @Authgor: gosaint
 * @Description:
 * @Date Created in 21:31 2018/1/7
 * @Modified By:客户端代码
 */
public class EchoClient {
    // 本机的IP地址
    private String host = "localhost";
    // 本机的端口号
    private int port = 8000;
    // socket 对象
    private Socket socket;
    // 构造器初始化Socket对象
    public EchoClient() throws IOException {
        socket = new Socket(host, port);
    }
    // 测试方法
    public static void main(String args[]) throws IOException {
        new EchoClient().talk();
    }
    
    private PrintWriter getWriter(Socket socket) throws IOException {
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(socketOut, true);
    }

    private BufferedReader getReader(Socket socket) throws IOException {
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }

    public void talk() throws IOException {
        try {
            // 从socket读取数据
            BufferedReader br = getReader(socket);
            // 向socket写入数据
            PrintWriter pw = getWriter(socket);
            // 把控制台输入的数据转换为字符流,然后读取
            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
            String msg = null;
            while ((msg = localReader.readLine()) != null) {
                // 将读取的数据写出的输出流(打印流)
                pw.println(msg);
                System.out.println(br.readLine());

                if (msg.equals("bye"))
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

服务端流程

package com.asiaInfo.caozg.ch_01;

import java.io.*;
import java.net.*;


public class EchoServer {
    private int port = 8000;
    private ServerSocket serverSocket;

    public EchoServer() throws IOException {
        serverSocket = new ServerSocket(port);
        System.out.println("服务器启动");
    }

    public String echo(String msg) {
        return "echo:" + msg;
    }

    private PrintWriter getWriter(Socket socket) throws IOException {
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(socketOut, true);
    }

    private BufferedReader getReader(Socket socket) throws IOException {
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }

    public void service() {
        while (true) {
            Socket socket = null;
            try {
                socket = serverSocket.accept();  //等待客户连接
                System.out.println("New connection accepted "
                        + socket.getInetAddress() + ":" + socket.getPort());
                // 从socket获取输入流字符,阅读消息
                BufferedReader br = getReader(socket);
                // 向socket写出数据
                PrintWriter pw = getWriter(socket);

                String msg = null;
                // 阅读消息
                while ((msg = br.readLine()) != null) {
                    System.out.println(msg);
                    // 写出消息
                    pw.println(echo(msg));
                    if (msg.equals("bye")) //如果客户发送的消息为“bye”,就结束通信
                        break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (socket != null) socket.close();  //断开连接
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String args[]) throws IOException {
        new EchoServer().service();
    }
}
4 Socket用法
    (1):连接本机1-1024端口
该Demo的作用是练习Socket对象的创建。我们通过连接端口,表明该端口被服务器监听了。在这个区间的大多端口已经被占用,但是我们还是可以连接没有被占用的端口。
public class PortScanner{
  
    public static void main(String[] args){
          private String host="localhost";//本机的IP地址
          new PortScanner().scan(host);
    }
    public void scan(String host){
         Socket s=null;
         try{
            for(int port=1;port<1024;port++){
                 // 创建socket对象
                s=new Socket(host,port);
                System.out.println("该端口没有被占用:"+port);
            }
         }catch(IOException e){
             Systrm.out.println("该端口被占用:"+port);
         }finally{
             try{
                 if(s!=null)
                     s.close;
             }catch(Exception e){
                 e.printStackTrance();
             }
         }
    }
}
原文地址:https://www.cnblogs.com/gosaint/p/8249909.html