首页 > 编程语言 >Java 网络编程(socket)

Java 网络编程(socket)

时间:2024-05-16 23:42:50浏览次数:27  
标签:Socket Java socket 编程 String new public dp 客户端

概念:

1.什么是网络编程?

   计算机跟计算机之间通过网络进行数据传输。

2.通信的软件架构C/S与B/S 的区别?

   C/S :客户端/服务端模式 (需要开发客户端)

   B/S :浏览器/服务端模式 (不需要开发客户端)

 

 

网络编程三要素:

1.IP

         设备在网络中的地址,是唯一的标识

2.端口号

          应用程序在设备中唯一的标识

3.协议

   数据在网络中传输的规则(对速率,传输代码,代码结构,传输控制步骤,出错控制等制定的标准)

   常见的协议有UDP、TCP、http、https、ftp

 

 

关于三要素的讲解:

1.IP  (Internet Protocol)

   互联网协议地址,也称IP地址, 是分配给上网设备的数字标签,上网设备在网络中的地址是唯一的。

   常见的IP分类:IPv4 、IPv6

  1.)IPv4 (互联网通信协议第四版)

          采用32位地址长度,分成4组,把每组的二进制转化为十进制,就是我们日常看见的IP。

   例如:192.168.1.66  (每组的取值范围是0--255)

   在IPv4中总共只有256*256*256*256(2^32个),不到43亿个IP

 2.)IPv6 (互联网通信协议第六版)

         IPv6是为了解决IPv4不够用而出现的

   采用128位地址长度,分成8组,有2^128个IP

   冒分十六进制表示法

   例如: 2001:DB8:0:23:8:800:200C:417A  (最前面的0可以省去)

   (特殊情况:如果中间有多个连续的0,可以采用0位压缩表示法)

   例如:FF01:0:0:0:0:0:0:1101  ——>  FF01::1101

 

常用的cmd命令:

    ipconfig : 查看本机IP地址

    ping : 检查网络是否连通 (ping 后面可以跟IP或网址)

 

2.端口号 (应用程序在设备中唯一的标识):

    由两个字节表示的整数,取值范围:0~65535

    其中0~1023之间的端口号用于一些知名的网络服务或应用

    注:一个端口只能被一个应用程序使用。

 

3.协议:

    计算机网络中,连接和通信的规则被称为网络通信协议。

    OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广

    TCP/IP参考模型(或 TCP/IP协议):国际标准

 

 

 

关于TCP和UDP:

1.二者的区别:

  UDP协议:

       1.用户数据报协议

       2.UDP是面向无连接的通信协议 (不管有没有和对方连接上,它只管发送)

       3.速度快,有大小限制(一次最多发送64K),数据不安全,易丢失数据

        (语音通话、在线视频)

  TCP协议:

       1.传输控制协议

       2.TCP协议是面向连接的通信协议

       3.速度慢,没有大小限制,数据安全

        (下载软件、文字聊天、发送邮件)

 

2.代码详解:

   1.)UDP通信程序     

             (发送数据):

              1.   创建发送端的DatagramSocket对象

              2.   数据打包(DatagramPacket)

              3.   发送数据

              4.   释放资源

public class test01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds=new DatagramSocket();
        
        String str="Hello World";
        byte[] bytes=str.getBytes();
        InetAddress address=InetAddress.getByName("127.0.0.1");
        int port=10086;
        
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
        
        ds.send(dp);
        
        ds.close();
    }
}

 

           (接受数据):

            1.   创建接收端的DatagramSocket对象

            2.   接收打包好的数据

            3.   解析数据包

            4.   释放资源

public class test02 {
    public static void main(String[] args) throws IOException {
        //一定要绑定跟发送的端口一样
        DatagramSocket ds=new DatagramSocket(10086);

        byte[] bytes=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
        ds.receive(dp);

        byte[]data=dp.getData();
        int len=dp.getLength();
        InetAddress address=dp.getAddress();
        int port=dp.getPort();
        System.out.println("接受到的数据为:"+new String(data,0,len));
        System.out.println("从地址为:"+address+"的这台电脑的"+port+"端口发出");

        ds.close();
    }
}

 

 

练习:

按照下面的要求实现程序

UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束

UDP接受数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

public class send {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds=new DatagramSocket();

        Scanner sc=new Scanner(System.in);
        while(true){
            System.out.println("输入要发送的话:");
            String str=sc.nextLine();
            if("886".equals(str)){
                break;
            }
            byte[]bytes=str.getBytes();
            InetAddress address=InetAddress.getByName("127.0.0.1");
            int port=10086;
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
            ds.send(dp);
        }

        ds.close();
    }
}
public class receive {
    public static void main(String[] args) throws IOException {
        //如果没绑定端口就是随机端口
        DatagramSocket ds=new DatagramSocket(10086);

        byte[]data=new byte[1024];
        DatagramPacket dp=new DatagramPacket(data,data.length);

        while (true){
            ds.receive(dp);

            byte[]res=dp.getData();
            int len= dp.getLength();
            String ip=dp.getAddress().getHostAddress();
            String name=dp.getAddress().getHostName();
            System.out.println("ip为:"+ip+",主机名为:"+name+"的人发送了数据:"+new String(res,0,len));
        }
    }
}

 

UDP的三种通信方式:

 

1.   单播(1对1)

 

2.   组播

 

       组播地址:224.0.0.0 ~ 239.255.255.255

 

       其中 224.0.0.0 ~ 224.0.0.255 为预留的组播地址

 

3.   广播

 

  广播地址:255.255.255.255

 

 

        2.)TCP通信程序     

                   TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象

                   通信之前要保证连接已经建立

                   通过Socket产生IO流来进行网络通信

 

客户端:

1.   创建客户端的Socket对象与指定服务端连接

 Socket(String host, int port)

2.   获取输出流,写数据

 OutputStream getOutputStream()

3.   释放资源

 Void close()

 

服务端:

1.   创建服务器端的Socket对象(ServerSocket)

 ServerSocket(int port)

2.   监听客户端的连接,返回一个Socket对象

 Socket accept()

3.   获取输入流,返回一个Socket对象

   InputStream  getInputStream()

4.   释放资源

 Void close()

/**
 * 发送数据
 */
public class client {
    public static void main(String[] args) throws IOException {
        //在创建对象的同时会连接服务器
        //如果连接不上就会报错
        Socket socket=new Socket("127.0.0.1",10086);

        OutputStream os=socket.getOutputStream();
        os.write("你好".getBytes());

        os.close();
        socket.close();
    }
}
/**
 * 接收数据
 */
public class server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(10086);

        Socket socket=ss.accept();

        InputStream is=socket.getInputStream();
        // 没有isr读出的中文会是乱码
        InputStreamReader isr=new InputStreamReader(is);
        //也可以用缓冲流
        //BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        int b;
        while ((b= isr.read())!=-1){
            System.out.print((char)b);
        }

        socket.close();
        ss.close();
    }
}

 

TCP 三次握手、四次挥手

三次握手:

1.    客户端 ――> 服务器端

 客户端向服务器发出连接请求,等待服务器确认

 

2.    客户端 <―― 服务器端

 服务器向客户端返回了一个响应,告诉客户端收到了请求

 

3.    客户端 ――> 服务器端

 客户端向服务器再次发出确认信息,连接建立

 

四次挥手:(确保连接断开,且数据处理完毕)

1.    客户端 ――> 服务器端

 客户端向服务器发出取消连接请求

 

2.    客户端 <―― 服务器端

 服务器向客户端返回一个响应,表示收到了客户端的取消请求

 

3.    客户端 <―― 服务器端

 服务器将最后的数据处理完毕

 服务器向客户端发出确认取消信息

 

4.    客户端 ――> 服务器端

 客户端再次发送确认消息,连接取消

 

标签:Socket,Java,socket,编程,String,new,public,dp,客户端
From: https://www.cnblogs.com/ztCoding/p/18196991

相关文章

  • hdu1176免费馅饼java
    一个数塔问题,以时间为纵坐标、位置为横坐标创建一个二维数组,然后从下往上相加。状态转移方程:9>=j>=1时dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j+1]),dp[i+1][j-1])  j=0时 dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]) j=10时dp[i][j]+=......
  • Java-并发-ReentrantLock
    0.是什么ReentrantLock是java.util.concurrent.locks包中的一个类,提供了比synchronized关键字更灵活和强大的锁机制。ReentrantLock实现了Lock接口,它允许显式地加锁和解锁,并提供了一些高级功能,如中断锁请求、超时锁请求、公平锁和非公平锁选择等。1.为什么在Java诞生......
  • 【自用】各类非编程类工具使用注意事项
    截图:FastStoneCapture截图保存时设置不压缩、256位彩色,比Snipaste及系统PrtSc截图保存的文件要大。drawio:drawio导出svg时嵌入字体会变糊。drawio画图在A4页面占比不能太大,否则导出为svg后再插入word会变得很模糊。文本格式化如果不勾选,则只能设置一种字体。组织架构图,要用正......
  • 《Spark编程基础》(Scala版)第八章简答题答案(自制)
    8SparkMLlib简答题T1与MapReduce框架相比,为何Spark更适合进行机器学习各算法的处理?答:通常情况下,机器学习算法参数学习的过程都是迭代计算。MapReduce由于延迟高、磁盘开销大、无法高效支持迭代计算,不适合高效的实现机器学习算法;Spark由于立足于内存计算,所以能很好地与......
  • P2 C++ 编程范式
    章节链接代码链接目录2.1.1C++工程的一般组织结构2.1.2C++工程在机器人中的组织结构2.2C++代码的编译2.2.1g++编译2.2.2make编译✅2.2.3CMake编译2.1.1C++工程的一般组织结构一般情况下,C++工程的组织结构是将不同的功能封装在不同的类中,每个类用配套的头文件......
  • 分布式数据处理-《Spark编程基础》(Scala版)第二章简答题答案(自制)
    2Scala语言基础简答题T1简述Scala语言与Java语言的联系与区别。答:①联系:(1)Scala和Java均运行在JVM之上;(2)Scala和Java均有面向对象语言特点;②区别:(1)Scala是类Java的多范式编程;Java是命令式编程。T2简述Scala语言的基本特性。......
  • 分布式数据处理-《Spark编程基础》(Scala版)第四章简答题答案(自制)
    4Spark环境搭建和使用方法简答题T1请阐述Spark的四种部署模式。......
  • 分布式数据处理-《Spark编程基础》(Scala版)第三章简答题答案(自制)
    3Spark的设计与运行原理简答题T1Spark是基于内存计算的大数据计算平台,请阐述Spark的主要特点。......
  • 分布式数据处理-《Spark编程基础》(Scala版)第七章简答题答案(自制)
    7SparkStreaming简答题T1请阐述静态数据和流数据的区别?答:静态数据是可以看作是静止不动的,适合进行批量计算;流数据是指数据以大量、快速、时变的流形式持续到达的,适合进行实时计算。同时,流计算被处理后,只有部分进入数据库成为静态数据,其余部分则被丢弃。T2请阐述批量计算和......
  • Java-线程-wait()、notify()和notifyAll()
    0.是什么(What)wait(),notify(),和notifyAll()方法都是Object类的一部分,用于实现线程间的协作。1.为什么(Why)线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们希望的是它们能够顺序的执行。所以引入了这几个方法,使得我们能保证一定的顺序。1.1Objec类......