java学习网络编程全总结——tcpudp多线程io流socket简易在线咨询聊天室java爬虫(代码片段)

毛_三月 毛_三月     2023-01-27     249

关键词:

网络编程

1.1、概述

信件:

打电话:—连接—接了—通话 TCP

发短信:—发送了就完事了—接收 UDP

计算机网络

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程的目的:

传播交流信息,数据交换,通信。

想要达到这个效果需要什么:

1、如何准确地定位网络上的一台主机:(端口),定位到这个计算机的某个资源。

2、找到了这个主机,如何传输数据呢?

javaweb:网页编程 B/S

网络编程:TCP/IP C/S

1.2、网络通信的要素

如何实现网络上的通信?

通信双方地址:

(192.168.1.1):局域网。。

  • ip:
  • 端口号

规则:网络通信的协议:

TCP/IP参考模型:

HTTP:超文本传输协议

FTP:文件上传协议

小结:

1、网络编程中有两个主要的问题:

  • 如何准确的定位到网络上的一台或者多台主机
  • 找到主机之后如何进行通信

2、网络编程中的要素

  • IP和端口号 IP
  • 网络通信协议 UDP,TCP

3、万物皆对象

1.3、IP

ip地址:inetAddress

  • 唯一定位一台网络上计算机
  • 127.0.0.1:本机loaclhost
  • Ip地址的分类
    • Ipv4/Ipv6
      • IPv4 127.00.1,四个字节组成,0-255,42亿(4,228,250,625);30亿都在北美,亚洲四亿,2011年就用尽;
      • IPV6:128位,8个无符号整数!
    • 公网(互联网)-私网(局域网)
      • ABCD类地址
      • 192.168.xx.xx专门给组织内部使用的
  • 域名:记忆IP问题!
    • IP:
package com.mao.lesson01;

import java.net.InetAddress;
import java.net.UnknownHostException;

// 测试IP
public class TestInetAddress 
    public static void main(String[] args) throws UnknownHostException 

        // 查询本机地址
        // getByName(String host) 确定主机名称的IP地址。
        final InetAddress byName = InetAddress.getByName("127.0.0.1");
        System.out.println(byName);         //  /127.0.0.1

        final InetAddress localhost = InetAddress.getByName("localhost");
        System.out.println(localhost);      // localhost/127.0.0.1

        // getHostAddress()  返回文本显示中的IP地址字符串。
        final InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);      // DESKTOP-JDIH9D6/10.102.211.250

        System.out.println("========================");
        // 查询网站ip地址
        final InetAddress byName1 = InetAddress.getByName("www.huchao.vip");
        System.out.println(byName1);        // www.huchao.vip/47.93.20.204

        System.out.println("======================");
        // 常用方法
        //
        System.out.println(byName1.getCanonicalHostName());         // 规范的名字   获取此IP地址的完全限定域名。              47.93.20.204
        System.out.println(byName1.getHostAddress());               // ip    返回文本显示中的IP地址字符串。                   47.93.20.204
        System.out.println(byName1.getHostName());                  // 域名,或者自己电脑的名字   获取此IP地址的主机名。    www.huchao.vip

    


1.4、端口(port)

端口表示计算机上的一个程序的进程

  • 不同的进程有不同的端口号!用来区分软件!

  • 被规定0-65535

  • TCP,UDP:65536*2 tcp:80,udp:80? 单个协议下,端口不能冲突、

  • 端口分类:

    • 公有端口0~1023

      • HTTP:80
      • https:443
      • FTP:21
      • Telent:23
    • 程序注册端口:1024~49151

      • Tomcat: 8080
      • MySQL: 3306
      • Oracle: 1521
    • 动态/私有:49152~65535

       1、netstat -ano #查看所有的端口
       2、netstat -ano|findstr "9640" # 查看指定的窗口 其中|是指先干后面的再在前面中找
       3、tasklist|findstr "8696" #查看指定端口的进程
      
package com.mao.lesson01;

import java.net.InetSocketAddress;

public class TestInetSocketAddres 
    public static void main(String[] args) 
        final InetSocketAddress inetSocketAddress = new InetSocketAddress("47.93.20.204", 8080);
        System.out.println(inetSocketAddress);                                      // /47.93.20.204:8080
        final InetSocketAddress localhost = new InetSocketAddress("localhost", 8080);
        System.out.println(localhost);                                             // localhost/127.0.0.1:8080
        final InetSocketAddress inetSocketAddress1 = new InetSocketAddress("127.0.0.1", 8080);
        System.out.println(inetSocketAddress1);                                   // /127.0.0.1:8080

        System.out.println("===================");
        System.out.println(localhost.getAddress());         // localhost/127.0.0.1
        System.out.println(localhost.getHostName());        // localhost
        System.out.println(localhost.getPort());            // 8080

        System.out.println("==================");
        System.out.println(inetSocketAddress.getAddress());     //  /47.93.20.204
        System.out.println(inetSocketAddress.getHostName());    //  47.93.20.204
        System.out.println(inetSocketAddress.getPort());        //  8080
    

1.5、通信协议

协议:约定,就好比我们现在说的是普通话。

网络通信协议:速率,传输码率,代码结构,传输控制。。。。。。

问题:非常的复杂

大事化小:分层!

TCP/IP协议簇实际上是一层协议

重要:

  • TCP:用户传输协议
  • UDP:用户数据报协议

出名的协议:

  • TCP:
  • IP:网络互联协议

ps:应用层:QQ、微信;传输层:通信;网络层:分包;数据链路层:具体的传输:如光纤,海底电缆。。。。。。;

TCP UDP对比:

详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”

https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc

TCP:打电话

  • 连接,稳定

  • 三次握手、四次挥手

  • 三次握手

  • 三次握手通俗理解

  •  三次握手
     最少需要三次,才能保证稳定连接!
     A;你愁啥?
     B:瞅你咋地?
     A:干一场!  
    

    四次挥手

    四次挥手通俗理解

     四次挥手
     A:我要走了
     B:你真的要走了吗?
     B:你真的真的要走了吗?
     A:我真的要走了!
    
  • 客户端、服务端

  • 传输完成,释放连接,效率低

UDP:发短信

  • 不连接,不稳定
  • 客户端、服务端:没有明确的界限
  • 不管有没有准备好,都可以发给你。。。
  • 导弹攻击
  • DDOS:洪水攻击!(饱和攻击)

1.6、TCP

有关socket的知识分享:https://www.cnblogs.com/dolphinx/p/3460545.html

API

 public class Socket
  extends Object
  implements Closeable

该类实现客户端套接字(也称为“套接字”)。套接字是两台机器之间通讯的端点。

套接字的实际工作由SocketImpl类的实例执行。 应用程序通过更改创建套接字实现的套接字工厂,可以配置自己创建适合本地防火墙的套接字。

  • 从以下版本开始:

    JDK1.0

SeverSocket:

API

public class ServerSocket
extends Object
implements Closeable

这个类实现了服务器套接字。 服务器套接字等待通过网络进入的请求。 它根据该请求执行一些操作,然后可能将结果返回给请求者。
服务器套接字的实际工作由SocketImpl类的实例执行。 应用程序可以更改创建套接字实现的套接字工厂,以配置自己创建适合本地防火墙的套接字。

为了使客户能成功地连接到服务器,服务器必须建立一个ServerSocket 对象,该对象通过将客户端地套接字对象和服务器端地一个套接字对象连接起来,从而达到连接的目的。

客户端:(socket对象)socket(IP地址,端口)

服务器:(ServerSocket对象)serversocket(端口 )用ServerSocket.accept()来建立一个和客户端的Socket对象相连接的Socket对象。

服务器端的输出流/输入流的目的地和客户端的输入流/输出流的源刚好相同。

服务端代码:

package com.mao.lesson02;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

// 服务端
public class TestServerDemo01 
    public static void main(String[] args) 
        ServerSocket serverSocket = null;
        Socket accept = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;

        try 
            // 1.我得有一个地址
            serverSocket= new ServerSocket(9999);

            while (true)
                //2. 等待客户端连接过来
                accept = serverSocket.accept();
                //3. 读取客户端的消息
                inputStream = accept.getInputStream();

                // 管道流
                byteArrayOutputStream = new ByteArrayOutputStream();
                byte[] bytes = new byte[1024];
                int length;
                while ((length=inputStream.read(bytes))!=-1)
                    byteArrayOutputStream.write(bytes,0,length);
                
                System.out.println(byteArrayOutputStream.toString());
            

         catch (IOException ioException) 
            ioException.printStackTrace();
        finally 
            if (byteArrayOutputStream!=null)
                try 
                    byteArrayOutputStream.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
            if (inputStream!=null)
                try 
                    inputStream.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
            if (accept!=null)
                try 
                    accept.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
            if (serverSocket!=null)
                try 
                    serverSocket.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        
    


客户端代码

package com.mao.lesson02;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

//客户端
public class TcpClientDemo01 
    public static void main(String[] args) 
        InetAddress byName =null;
        Socket socket=null;
        OutputStream outputStream=null;
        try 
            //1.要知道服务器的地址,端口号
            byName = InetAddress.getByName("127.0.0.01");
            int port =9999;
            //2.创建一个socket连接
            socket = new Socket(byName,port);
            //3.发送消息 io 流
            outputStream = socket.getOutputStream();
            outputStream.write("你好,我是胡超,欢迎和我一起学习Java网络编程".getBytes());
         catch (Exception e) 
            e.printStackTrace();
        finally 
            if (socket!=null)
                try 
                    socket.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
            if (outputStream!=null)
                try 
                    outputStream.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        

    


每执行一次客户端代码,都会在服务端显示一次

进程堵塞

提升作用域

文件上传

服务器端:

package com.mao.lesson02;

import com.sun.org.apache.bcel.internal.generic.NEW;

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

/**
 * @Author HuChao
 * @Description //TODO Hasee
 * @Date 17:28 2021/11/2
 * @Param
 * @return
 **/
public class TcpServerDemo02 
    public static void main(String[] args) throws Exception 
        // 1.创建服务
        final ServerSocket serverSocket = new ServerSocket(9000);
        // 2.监听客户端连接
        final Socket socket = serverSocket.accept();    //阻塞式监听,会一直等待客户端的到来

        // 3.获取输入流
        final InputStream inputStream = socket.getInputStream();
        // 4.文件输出
        final FileOutputStream fileOutputStream = new FileOutputStream(new File("recevie.png"));
        //创立缓冲区和写
        final byte[] bytes = new byte[1024];
        int length;
        while ((length=inputStream.read(bytes))!=-1)
            fileOutputStream.write(bytes,0,length);
        
        // 通知客户端接受完毕
        final OutputStream outputStream = socket.getOutputStream();
        outputStream.write("客户端,服务都端接受完毕了,你可以断开了".getBytes());

        // 关闭资源
        outputStream.close();
        fileOutputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    


 
 /*
 1、接收要read,所以要用inputStream
 2、要把文件写给大家看,所以要fileoutputstream
  */

客户端:

package com.mao.lesson02;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * @Author HuChao
 * @Description //TODO Huchao
 * @Date 17:28 2021/11/2
 * @Param
 * @return
 **/
public class TcpClientDemo02 
    public static void main(String[] args) throws Exception 
        // 1.创建一个socket连接
        final Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        // 2.创建一个输出流
        final OutputStream outputStream = socket.getOutputStream();
        // 3.读取文件
        final FileInputStream fileInputStream = new FileInputStream(new File("双湖拍.png"));
        // 4.写出文件
        final byte[] bytes = new byte[1024];
        int length;
        while ((length=fileInputStream.read(bytes))!=-1)
            outputStream.write查看详情  

android网络知识点全总结(1-http)

说到网络,就不得不先说一下HTTP。HTTP的概念、原理、工作机制、数据格式 HTTP的定义一种网络传输协议,位于TCP/IP协议族的最顶层——应用层HTTPHypertextTransferProtocol,超文本传输协议,和HTML(HypertextMarkupLanguage超... 查看详情

stlc++stl超全总结(代码片段)

STL目录页面C++STL超全总结-基于算法竞赛(悠享版)(更好观感)使用STL的高精度模板vector<int>mul(vector<int>&a,vector<int>&b) vector<int>c(a.size()+b.size()); for(i 查看详情

stlc++stl超全总结(代码片段)

STL目录页面C++STL超全总结-基于算法竞赛(悠享版)(更好观感)使用STL的高精度模板vector<int>mul(vector<int>&a,vector<int>&b) vector<int>c(a.size()+b.size()); for(i 查看详情

java多线程编程

最近在重新整理学习Java的多线程。首先,考虑一下什么时候需要用到多线程。通常是一些异步处理,后台任务,要尽量使资源最大化使用如CPU,I/O,Printer等等。可以参考以下http://www.cnblogs.com/kenshinobiy/p/4671314.html 学习tutorials... 查看详情

面向校招计算机网络全总结(代码片段)

0.什么是网络协议,为什么要对网络协议分层?网络协议是计算机在通信过程中要遵循的一些约定好的规则。网络分层的原因:易于实现和维护,因为各层之间是独立的,层与层之间不会收到影响。有利于标准化的... 查看详情

面向校招计算机网络全总结(代码片段)

0.什么是网络协议,为什么要对网络协议分层?网络协议是计算机在通信过程中要遵循的一些约定好的规则。网络分层的原因:易于实现和维护,因为各层之间是独立的,层与层之间不会收到影响。有利于标准化的... 查看详情

多线程学习(代码片段)

多线程的好处1、并行编程可以使程序执行速度极大的提高,java本身是一种多线程语言。2、使用多线程可以利用机器额外的处理器,资源充分利用。简单介绍        java的线程机制是抢占式的,这表... 查看详情

关于innodb锁的超全总结(代码片段)

几个月之前,开始深入学习MySQL。说起数据库,并发控制是其中很重要的一部分。于是,就这样开起了MySQL锁的学习,随着学习的深入,发现想要更好的理解锁,需要了解MySQL事务,数据底层的存储方式,MySQL的执行流程,特别是... 查看详情

go踩坑经验全总结:项目结构配置管理api设计

著名编程语言排名指数TIOBE近期发布了2021年各大主流编程语言最终排名,与2020年相比,2021年Go从第14名上升到第13名,继续保持稳健的发展节奏。并且TIOBE配文中认为,除了Go和Swift之外,不会有新的编程语言能迅速进入前3名甚至... 查看详情

多进程单线程多端口tcpudp三层协议转发

端口转发1、需要端口转发的场合不胜枚举。既要适应windowsserver,也要适应linuxserver,场景如下所示a)目标网络不好b)目标机器在内网c)不能直接连接目标端口d)目标机器不能直接出网等场景2、程序使用多进程方式,每... 查看详情

java多线程编程核心技术学习-2

停止线程:暂停线程:yield方法:线程优先级:守护线程: 查看详情

java学习---多线程

1.线程概述2.线程实现(2种方式)2.1通过Thread子类实现(Run方法、Start方法)//继承Thread的方法开启多线程publicclassDemo11_1extendsThread{publicvoidrun(){//线程运行的程序内容for(inti=0;i<10;i++){System.out.println(Thread.currentThread().getName( 查看详情

c++全总结(代码片段)

1//CPPTEST.cpp:定义控制台应用程序的入口点。2//34#include"stdafx.h"5#include<iostream>6#include<map>7#include<fstream>8#include<cassert>9#include<sstream>10#include"TMyNumOperator.h"11# 查看详情

rabbitmq由浅入深入门全总结(代码片段)

写在最前面距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~这篇文章有点长,就分了两篇PS:那个Github上Jav... 查看详情

java多线程学习-一

开启多线程1,继承Thread2,重写run方法3,将要执行的代码写在run方法中4,创建Thread类的子类对象5,开启线程/***@paramargs*/publicstaticvoidmain(String[]args){MyThreadmt=newMyThread();//4,创建Thread类的子类对象mt.start();//5,开启线程for(inti=0;i<1000;i++ 查看详情

bingbingc(网络编程tcpudp)(代码片段)

上一篇目录标题字节序字节序转化TCP和UDPUDPsocket编程接口编码TCP接口检查连接是否成功代码单线程多进程服务端多线程高级IO参考字节序小端字节序:低位放在低地址大端字节序:低位放在高地址主机字节序:指的是机器本身的字节... 查看详情

bingbingc(网络编程tcpudp)(代码片段)

上一篇目录标题字节序字节序转化TCP和UDPUDPsocket编程接口编码TCP接口检查连接是否成功代码单线程多进程服务端多线程高级IO参考字节序小端字节序:低位放在低地址大端字节序:低位放在高地址主机字节序:指的是机器本身的字节... 查看详情