TCP网络编程

一、网络的七层模型

       从下往上依次是物理层(电路,布线)-数据链路层(交换机)-网络层(tcp/ip,路由器)-传输层-会话层-表示层(编码,解码,加密,解密,压缩,解压缩)-应用层(http),但是tcp/ip模型是网络接口层-网络层-传输层-应用层

二、三次握手和四次挥手(详解见另一篇TCP详解博文

      1.  三次握手:

         (1) 客户端向网络服务器端发送请求 (你在吗?)

         (2) 服务器端回应客户端的请求 (我在)

         (3) 服务器端向客户端发送请求 (我在,你在吗?)

      2. 四次挥手

          (1) 客户端向服务器端发送请求 (我要挂了)

          (2) 服务器端回应客户端 (嗯)

          (3) 服务器端回应客户端 (那我挂了)

          (4) 客户端回应服务器端 (嗯,好)

三、常用的InetAddress的主要函数

package com.study.test;

import java.io.IOException;
import java.net.InetAddress;

public class NetTest {

    public static void main(String[] args) throws IOException {
        InetAddress ia = InetAddress.getLocalHost();
        System.out.println(ia.getHostName());// 获得本机名字
        System.out.println(InetAddress.getByName(ia.getHostName()));// 通过名字查询到ip地址
        byte[] b = new byte[4];
        b = ia.getAddress();// 以字节的形式存放的地址
        System.out.println(ia.getHostAddress());// 以字符串形式列出的ip地址

    }

}

输出结果:

xx
xx/192.168.152.1
192.168.152.1

四、tcp编程服务端与客户端通讯

      1. 服务端代码

package com.study.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 编程实现tcp通讯服务端
 * 
 * @author THINKPAD
 *
 */
public class NetServer {

    public static void main(String[] args) throws IOException {
        // 1 建立服务端socket
        ServerSocket ss = new ServerSocket(60000);// 1、有效没有指明ip地址,则本网卡对应的所有ip地址全部
        // 通信的时候一定要有目标端口号,如果没有,则补救bind
        // ServerSocket ss=new ServerSocket();
        // SocketAddress sa=new InetSocketAddress(60000);
        // ss.bind(sa);
        // 2 进行接收连接
        Socket s = ss.accept(); // 阻塞等待,等待三次握手 1 syn 2 ack syn 3 ack ,一旦握手成功,形成一个通道
        System.out.println(s.getPort() + "连接进来了"); // 如果tcp每次发送信息,对方一定要确认收到的,这样可以保证数据不丢失

        while (true) {
            // 3 接收传送的信息,通过网络流/节点流
            InputStream is = s.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            char[] cArray = new char[20];
            int iRead = isr.read(cArray);// 阻塞函数,一定要接收到数据 比如:in.read()一定要从键盘缓冲区获得数据,而这个等待是一定要从服务器获得数据
            if (iRead == -1)
                break;
            System.out.println("得到的字节数:" + iRead);// 返回字节数
            System.out.println("收到的信息是" + new String(cArray, 0, iRead));
            // 3.1 回复信息
            OutputStream os = s.getOutputStream();
            Scanner sc = new Scanner(System.in);
            String sSend = sc.nextLine();
            os.write(sSend.getBytes());
        }
        // 4 关闭 结束之后就会发生4次挥手 1 fin ack 2 ack 3 fin ack 4 ack
        ss.close();
        s.close();

    }

}

2. 客户端代码

package com.study.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * 编程实现tcp通讯的客户端
 * 
 * @author THINKPAD
 *
 */
public class NetClient {
    public static void main(String[] args) throws IOException {
        // 1 建立客户端socket ,建立一个通道
        Socket s = new Socket("192.168.152.1", 60000);
        while (true) {
            // 2.1 先发送信息
            OutputStream os = s.getOutputStream();
            Scanner sc = new Scanner(System.in);
            String sSend = sc.nextLine();
            os.write(sSend.getBytes());

            // 2.2 接收传送的信息,通过网络流/节点流
            InputStream is = s.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            char[] cArray = new char[20];
            int iRead = isr.read(cArray);// 阻塞函数,一定要接收到数据 比如:in.read()一定要从键盘缓冲区获得数据,而这个等待是一定要从服务器获得数据
            if (iRead == -1)
                break;
            System.out.println("得到的字节数:" + iRead);// 返回字节数
            System.out.println("收到的信息是" + new String(cArray, 0, iRead));
        }
        // 3 关闭 结束之后就会发生4次挥手 1 fin ack 2 ack 3 fin ack 4 ack
        s.close();

    }

}

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值