当前位置: 首页 > article >正文

TCP编程案例

笔记:(本题可能需要的)

TCP协议:

TCP协议进行通信的两个应用进程:客户端、服务端。

使用TCP协议前,须先建立TCP连接,形成基于字节流的传输数据通道

传输前,采用“三次握手”方式,点对点通信,是可靠的

传输完毕,需释放已建立的连接,效率低

在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

在发送数据结束后,释放连接时需要经过四次挥手

Socket类

网络上具有唯一标识的IP地址和端口号组合在一起构成唯一能识别的标识符套接字(Socket)

Socket相关类API

   ServerSocket类

ServerSocket类的构造方法:

ServerSocket(int port) :创建绑定到特定端口的服务器套接字。

ServerSocket类的常用方法:

Socket accept():侦听并接受到此套接字的连接。

     Socket类

Socket类的常用构造方法

public Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。

   Socket类的常用方法

public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息

public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息

public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。

例题1:客户端发送内容给服务端,服务端将内容打印到控制台上。
     注意点:先启动服务端,在启动客户端
           这里的IP地址和端口号使用自己电脑的
           查询IP地址:在运行框输入ipconfig
           查询端口号:在运行框输入netstas -ano
客户端创建步骤:
》1创建一个Socket
      创建一个IP地址,创建一个端口号;Socket是由IP地址和端口号组合在一起组合在一起的;----------IP地址和端口号都是服务端的
      将IP地址和端口号传入Socket构造器中,创建Socket对象(即创建一个流套接字)
》发送数据
      通过Socket对象调用getOutputStream()方法------返回此套接字的输出流
      通过输出流对象调用write()方法--------书写要发送的信息
》关闭资源(在关闭前都要判断该对象是否创建成功)
      关闭流资源
      关闭流套接字资源
  @Test// 客户端
    public void client() throws IOException {
        Socket socket = null;
        OutputStream os = null;
        try {
            //创建一个Socket
            InetAddress inetAddress = InetAddress.getByName("192.168.242.33");//声明对方的IP地址
            int port=10620;//声明对方的端口号
            socket = new Socket(inetAddress, port);
            //发送数据
            os = socket.getOutputStream();
            os.write("你好,我是客户端,请多多关照".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭Socket
            try {
                if(socket!=null)
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(os!=null)
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
服务端创建步骤
》创建一个ServerSocket(即创建绑定到特定端口的服务器套接字)
》调用accept(),接受客户端的Socket
      通过前面ServerSocket的对象调用accept()方法(阻塞式方法)-----------侦听并接受到此套接字的连接。
      调用accept()方法返回的是一个Socket类的对象--------表示连接成功,接受客户端的Socket
》接收数据
      通过前面得到的Socket的对象来调用getInputStream()------------得到流对象
      通过流的对象来读取数据
》关闭资源(在关闭前都要判断该对象是否创建成功)
      关闭ServerSocket资源
      关闭Socket资源
      关闭流资源
 @Test//服务端
    public void server() throws IOException {
        ServerSocket serverSocket = null;
        Socket socket = null;//阻塞式的方法
        InputStream is = null;
        try {
            //创建一个ServerSocket
            int port=10620;
            serverSocket = new ServerSocket(port);
            //调用accept(),接受客户端的Socket
            socket = serverSocket.accept();
            //接收数据
            is = socket.getInputStream();
            byte[] buffer=new byte[1024];
            int len;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();//内部维护了一个byte数组
            while ((len=is.read(buffer))!=-1){
                //错误的
//                String str = new String(buffer, 0, len);
//                System.out.println(str);
                //正确的
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());
            System.out.println("数据接收完毕");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭Socket,ServerSocket,流
            try {
                if(socket!=null)
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(serverSocket!=null)
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(is!=null)
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


http://www.kler.cn/a/427600.html

相关文章:

  • 基于Matlab的卷积神经网络(CNN)苹果分级检测系统
  • 视频编辑技术:一键生成混剪视频的AI技术应用
  • scss文件内引入其他scss文件报错
  • 十九(GIT2)、token、黑马就业数据平台(页面访问控制(token)、首页统计数据、登录状态失效)、axios请求及响应拦截器、Git远程仓库
  • Nginx日常运维方法Linux版
  • 【LeetCode】80.删除有序数组中的重复项II
  • 目前国内【齿轮检测仪】行业整体较为分散,行业竞争日趋激烈
  • 斗地主之顺子(Java Python JS C++ C )
  • 《Java核心技术I》线程局部变量
  • python包之click
  • 使用xtrabackup对MySQL5.7数据库进行物理备份
  • 四个人排序——c++选择结构提高
  • 【调试工具】USB 转 UART 适配器(USB 转 TTL)
  • 华为 Mate 70 系列智能手机将运行不兼容 Android 的鸿蒙
  • 深入解析汽车对自行车手纵向成人碰撞测试(CBLA)
  • CSS3 动画详解,介绍、实现与应用场景详解
  • Alogrithm:老鼠走迷官(一)
  • uwsgi与Django结合的多线程多进程详解
  • 亚马逊云科技re:Invent:生成式AI的最新进展
  • 时序预测算法TimeXer代码解析