博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP/IP以及Socket对象基本
阅读量:6466 次
发布时间:2019-06-23

本文共 5036 字,大约阅读时间需要 16 分钟。

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

你可能感兴趣的文章
HDU 1402 A * B Problem Plus FFT
查看>>
[CareerCup] 17.3 Factorial Trailing Zeros 求阶乘末尾零的个数
查看>>
Security updates and resources
查看>>
深入理解JavaScript系列(25):设计模式之单例模式
查看>>
DNS为什么通常都会设置为14.114.114.114
查看>>
给定一个序列,判断该序列是否为二叉树查找树的后序遍历序列
查看>>
Sqoop架构(四)
查看>>
golang copy函数
查看>>
《你有多少问题要请示》精华集粹
查看>>
深度 | 机器学习敲门砖:任何人都能看懂的TensorFlow介绍【转】
查看>>
leveldb学习:DBimpl
查看>>
MySQL存储引擎--MYSIAM和INNODB引擎区别
查看>>
[Recompose] Stream Props to React Children with RxJS
查看>>
打印图片
查看>>
SHOW CREATE DATABASE Syntax
查看>>
rsync常见问题及解决办法
查看>>
AKM项目轶事之GBS同事转入GDC
查看>>
MySQL日期 专题
查看>>
C#中禁止程序多开
查看>>
分布式缓存Redis使用以及原理
查看>>