美文网首页
TCP/IP简单介绍

TCP/IP简单介绍

作者: 金馆长说 | 来源:发表于2017-03-27 18:44 被阅读246次

    tcp/ip只是一个协议族的称号,就是说一个家族的意思。它里面有各种协议,比如 ip协议、ftp协议、udp协议。Java中为使用TCP协议提供了二个类 Socket和ServerSocket,一般的socket模式中,Serversocket只有一个,Socket而有
    多个。

    TCP连接建立步骤

    客户端和服务端建立连接后,就被动的等待服务器的响应。典型的TCP客户端要经过以下步骤。

    客户端

    1. 创建一个Socket实例,构造函数指定远程主机的IP地址和端口号。
    • 通过Socket的I/O流来和服务器进行通信
    • 使用Socket的close来关闭连接。

    服务端

    1. 创建一个ServerSocket实例指定本地端口,监听客户端在该端口发起的TCP请求
    2. 重新执行accept方法来获取客户端的连接
    3. 为获取的客户端开启一个新线程,利用I/O流和客户端进行通信。通信完成调用客户端的close方法关闭流。

    下面通过代码来体现上面说的步骤

    Socket

    Socket就是一个客户端,可以和ServerSocket建立起连接,建立连接后就可以和Server进行通信了。创建一个Socket要指定IP地址和端口号。每个Socket都会关联一个InputStream和OutPutSteram,我们通过 把字节写入套接字的OutOutStream来发送数据,并且通过InputSrteam来接收数据。

      public static void main(String[] args) throws IOException {
              //客户端请求与本机在20006端口建立TCP连接
              Socket client = new Socket("127.0.0.1", 1217);
              client.setSoTimeout(10000);
              //获取键盘输入
              BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
              //获取Socket的输出流,用来发送数据到服务端
              PrintStream out = new PrintStream(client.getOutputStream());
              //获取Socket的输入流,用来接收从服务端发送过来的数据
              BufferedReader buf =  new BufferedReader(new InputStreamReader(client.getInputStream()));
              boolean flag = true;
              while(flag){
                  System.out.print("输入信息:");
                  String str = input.readLine();
                  //发送数据到服务端
                  out.println(str);
                  if("bye".equals(str)){
                      flag = false;
                  }else{
                      try{
                          //从服务器端接收数据有个时间限制(系统自设,也可以自己设置),超过了这个时间,便会抛出该异常
                          String echo = buf.readLine();
                          System.out.println(echo);
                      }catch(SocketTimeoutException e){
                          System.out.println("Time out, No response");
                      }
                  }
              }
              input.close();
              if(client != null){
                  //如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭
                  client.close(); //只关闭socket,其关联的输入输出流也会被关闭
              }
          }
    
    

    ServerSocket

    服务端的工作就是建立一个通信端,被动等待客户端的连接请求。

       public static void main(String[] args) throws Exception{
               //开启一个服务端,端口号1217
               ServerSocket server = new ServerSocket(1217);
               Socket client = null;
               boolean f = true;
               while(f){
                System.out.println("服务开启成功!");
                   //等待客户端的连接,会一直等待。
                   client = server.accept();
                   System.out.println("与客户端连接成功!");
                   //为每个客户端连接开启一个线程
                   new Thread(new ServerThread(client)).start();
               }
               server.close();
           }
    
    
        public static class ServerThread implements Runnable {
    
            private Socket client = null;
            public ServerThread(Socket client){
                this.client = client;
            }
    
            @Override
            public void run() {
                try{
                    //获取Socket的输出流,用来向客户端发送数据
                    PrintStream out = new PrintStream(client.getOutputStream());
                    //获取Socket的输入流,通过它来获取客户端发送的信息。
                    BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    boolean flag =true;
                    while(flag){
                        //接收从客户端发送过来的数据
                        String str =  buf.readLine();
                        System.out.println(str);
                        if(str == null || "".equals(str)){
                            flag = false;
                        }else{
                            if("bye".equals(str)){
                                flag = false;
                            }else{
                                //将接收到的字符串前面加上echo,发送到对应的客户端
                                out.println("服务器收到了信息:" + str);
                            }
                        }
                    }
                    out.close();
                    client.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    
    

    参考

    相关文章

      网友评论

          本文标题:TCP/IP简单介绍

          本文链接:https://www.haomeiwen.com/subject/zvnrottx.html