Socket编程实现TCP、UDP样例

news2024/9/24 7:14:08

文章目录

    • 一.Socket简介
    • 二.Socket实现TCP
      • TCP通信简介
      • 使用对象及方法简介
      • 代码实现
        • 服务端代码
        • 客户端代码
    • 三.Socket实现UDP
      • UDP通信简介
      • UDP程序的使用步骤
      • 代码实现
        • 服务端代码
        • 客户端代码

一.Socket简介

socket套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元.

换句话说socket(套接字)的作用就是将应用程序通过端口连接起来.

在Java中,提供了一些基础类供我们去进行一些网络传输的操作.

二.Socket实现TCP

TCP通信简介

TCP通信能实现两台计算机之间的数据交互,通信的两端要严格区分客户端和服务器端

  1. 服务端程序,需要事先启动,等待客户端的连接.
  2. 客户端程序应该主动连接服务器端,连接成功才能通信.服务端不可以主动连接客户端.

所谓的TCP协议不过是传输数据时有固定的文本格式而已,底层传输数据是一样的.

使用对象及方法简介

在JAVA中,提供了两个类用于实现TCP通信程序.

  1. 客户端:java,net.Socket类表示.创建Socket(套接字)对象,向服务端发出连接请求,服务器端响应请求,两者建立连接开始通信.
  2. 服务端:java.net.ServerSocket类表示,创建ServerSocket对象,相等于开启了一个服务,并等待客户端的连接.

1.Socket类

  1. 构造方法:
    public Socket(String host,int port):
    创建套接字对象并将其连接到指定的主机上的指定端口号.(如果指定的host是null,则相当于指定地址为回送地址).
    host:IP地址 port:端口号

  2. 其他主要方法.
    (1).public InputStream getInputStream():获取套接字的输入流.
        接收数据.返回InputStream对象

    (2).public OutPutStream getOutPutStream();获取套接字的输出流.
        发送数据.返回OutputStream对象

    (3).public void close():关闭此套接字.

    (4).public void shutdownOutPut():禁用此套接字的输出流.

2.ServerSocket类
实现了服务器套接字,该对象等待网络请求.

  1. 构造方法:
    public ServerSocket(int port):
    创建ServerSocket对象,并将其绑定到一个指定的端口号上.
  2. 其他主要方法:
    public Socket accept():
    侦听并接受连接,返回一个新的Socketd对象.该方法会一直运行直到建立连接.

代码实现

服务端代码

public class Server {
    public static void main(String[] args) {
        //1.构建服务器对象
        ServerSocket serverSocket=null;
        BufferedReader br=null;
        PrintWriter printWriter=null;
        try {
             serverSocket=new ServerSocket(6789);   //注意端口号不要比1024小

             //2.设置准备阶段,一直等待接收信息
            Socket socket = serverSocket.accept();         //这里返回客户端的对象,在客户端关闭,这里不进行关闭
            //5.获得套接字之后(连接),客户端读取数据
            //写法一:
//            InputStream input = socket.getInputStream();
//            InputStreamReader inputReal=new InputStreamReader(input);
//            BufferedReader br=new BufferedReader(inputReal);                //BufferedRead有读取一行的方法,比较方便
            //写法二.(升级版)
            br= new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String temp=null;

            printWriter= new PrintWriter(socket.getOutputStream());
            while((temp=br.readLine())!=null){
                System.out.println(temp);
                //6.客户端发送相应数据,一定得写在读数据的里面,不然不会执行这些语句
                printWriter.println("服务器端相应数据");
                printWriter.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(printWriter!=null){
                printWriter.close();
            }
            if(br!=null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
            if(serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }
}

客户端代码

public class Client {
    public static void main(String[] args) {
        //3建立Socket对象
        Socket socket=null;
//        OutputStreamWriter outreal=null;
        PrintWriter pw=null;
        BufferedReader bufferedReader=null;
        try {
            socket=new Socket("127.0.0.1",6789);
            //4.建立输出流,客户端主动向服务端发出信息.
            //方式一:
//            OutputStream out = socket.getOutputStream();
//            outreal=new OutputStreamWriter(out);
//            outreal.write("我发出请求,请求连接");
//            outreal.write("\r\n".toCharArray());
//
//            outreal.write("我发出请求,请求连接");
//            outreal.write("\r\n".toCharArray());
//            outreal.flush();                            //必须刷新
            //方式二:(该方法更简便一点,使用PrintWriter)
            OutputStream out = socket.getOutputStream();
            pw=new PrintWriter(out);
            pw.println("客户端发出请求,请求连接");
            pw.flush();
            pw.println("客户端发出请求,请求连接");
            pw.flush();
            //7.接受服务器端相应数据
            bufferedReader= new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String temp=null;
            while((temp=bufferedReader.readLine())!=null){
                System.out.println(temp);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bufferedReader!=null){                 //防止出现空指针异常
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(pw!=null){
                pw.close();
            }
            if(socket!=null){                        
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }
}

上述代码其实主要分为7个步骤:

  1. 构建服务器对象
  2. 服务端开启等待
  3. 构造客户端对象
  4. 客户端主动发送数据
  5. 服务端接收数据
  6. 服务端发送相应数据
  7. 客户端接收相应数据

最主要的就是服务端要先开启等待监听,然后客户端去和服务端建立连接,然后就可以发送数据了.

三.Socket实现UDP

UDP通信简介

  1. UDP协议.
    用户数据报协议(UDP) 是网络信息传输的另- -种形式。基于UDP的通信和基于TCP的通信不
    同,基于UDP的信息传递更快,但不提供可靠的保证。使用UDP传递数据时,用户无法知道数据能 否正确地到达主机,也不能确定到达目的地的顺序是否和发送的顺序相同。虽然UDP是–种不可靠 协议,但如果需要较快地传输信息,并能容忍小的错误,可以考虑使用UDP.

  2. 基于UDP通信的基本模式.
    (1)将数据打包(称为数据包),然后将数据包发往目的地。
    (2)接收别人发来的数据包, 然后查看数据包。

UDP程序的使用步骤

发送数据包:

  1. 使用DatagramSocket(创建一个数据包套接字).
  2. 使用DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)创建要发送的
    数据包。
  3. 使用DatagramSocket类的send()方法发送数据包。

接收数据包:

  1. 使用DatagramSocket(int port)创建数据包套接字,绑定到指定的端口。
  2. 使用DatagramPacket(byte[] buf, int length)创建字节数组来接收数据包。
  3. 使用DatagramSocket类的receive()方法接收UDP包。

注意:
    DatagramSocket类的receive()方法接收数据时,如果还没有可以接收的数据,在正常情况下
receive()方法将一直阻塞,直到网络上有数据传来.此时receive()方 法接收该数据并返回。
    如果网络上没有数据发送过来,receive(方法也没有阻塞,肯定是程序有问题,大多数是使用了一个被其他程序占用的端口号。

代码实现

服务端代码

 public class UDPServer {
	public static void receive(int port) {
		try {
			//1.创建套接字,绑定端口
			DatagramSocket socket = new DatagramSocket(port);
			//2.创建DatagramPacket对象用于接收数据
			byte[] buf=new byte[1024];
			DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length);
			//接收数据
			System.out.println("服务端初始化成功...");
			while(true) {
				socket.receive(datagramPacket);
				System.out.println(new String(buf));
			}
			
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
			receive(10111);			
		
	}
}

客户端代码

  public class UDPClient {
	public static void sendData(String ip,String data,int port) {
		DatagramSocket datagramSocket;
		try {
			//1.创建套接字
			datagramSocket = new DatagramSocket();
			//2.创建要发送的数据包
			InetAddress address = InetAddress.getByName(ip);
			DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(), data.length(), address, port);
			//3.发送数据
			datagramSocket.send(datagramPacket);
			System.out.println("客户端发送数据成功...");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		sendData("192.168.77.15", "你是个大傻子",10111);
	}
}


今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

私企招聘:思特威社会招聘

关于我们 思特威(上海)电子科技股份有限公司 SmartSens Technology (股票简称:思特威,股票代码:688213)是一家从事CMOS图像传感器芯片产品研发、设计和销售的高新技术企业,总部设立…

pads logic 生成参考编号带分隔符以及不统计不贴元器件的BOM

1.查看BOM报告 ,这里可以通过下面的方法 Step1:点击文件 Step2: 勾选材料清单,然后点击设置 Step3:在弹出的如下窗口,选择剪切板视图 ,然后选择全选,然后复制,将数据粘贴到excel表格中即可。 2. 参考编号分隔符 …

以前不知道字节面试难在哪,现在体验到了,被虐的很惨

…(这里省略一些不清楚、不知道、忘记了之类的词藻,保留一丝尊严。) 接下来是关于redis哲学三连“是什么?为什么?怎么用?” 我把肚子里仅有的关于Redis的一滴墨水挤成了三滴,仍然没有给出他想要的。继续追问Redis的数据存储方式,操作方法…

微服务框架 SpringCloud微服务架构 微服务保护 30 初识Sentinel 30.1 雪崩问题及解决方案

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护30 初识Sentinel30.1 雪崩问题及解决方案30.1.1 雪崩问题30.1.2 总结30 初识Sentinel 30.1 雪崩问…

类别不平衡Class-imbalance解决方法

类别不平衡是指分类任务中不同类别的训练样例数目差别很大的情况。 1、扩大数据集 2、欠采样 欠采样(under-sampling):对大类的数据样本进行采样来减少该类数据样本的个数,使其与其他类数目接近,然后再进行学习。 随…

第十四届蓝桥杯集训——JavaC组第九篇——位运算符

第十四届蓝桥杯集训——JavaC组第九篇——位运算符 目录 第十四届蓝桥杯集训——JavaC组第九篇——位运算符 值交换 异或值交换 其它位移符号&#xff1a; 这个稍微难度大一些&#xff0c;基础的有【&与、|或、^异或、<<左位移、>>右位移】。 我们一个一个…

游戏开发43课 移动游戏性能优化2

2. 资源优化 病从口入&#xff0c;资源好比是入口&#xff0c;它们若出现问题&#xff0c;会引发一连串性能问题。相反&#xff0c;资源若是优化得好&#xff0c;后面所有章节的性能都可受益。这也是把资源优化的章节提到最前的原因。 2.1 纹理优化 纹理优化的目的是让它们占…

多锦鑫能:低碳化、智能化、无人化矿山运营时代来临

全球气候变暖已经成为人类社会必须面对的重大课题&#xff0c;国际社会在推动节能减排、实现碳中和大目标上也已经达成一致意见。中国作为全球第二大经济体和负责任的大国&#xff0c;也明确向国际社会承诺&#xff0c;将在2030年实现碳达峰、2060年前实现碳中和目标。 围绕这…

[附源码]计算机毕业设计基于Vuejs的中国名茶销售平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

作者推荐 | 【分布式技术专题】「架构设计方案」图解学习法总结集群模式下的各种软负载均衡策略实现及原理分析

背景介绍 在分布式系统中&#xff0c;负载均衡是非常重要的环节&#xff0c;通过负载均衡将请求派发到网络中的一个或多个节点上进行处理。 通常来说&#xff0c;负载均衡分为硬件负载均衡及软件负载均衡。硬件负载均衡&#xff0c;顾名思义&#xff0c;在服务器节点之间安装专…

功能安全软件架构

已剪辑自: https://mp.weixin.qq.com/s/pCenGTqg2Xi_t7b8ebNHMA 1. E-GAS 安全架构思想 汽车功能安全旨在把电子电气系统失效而导致的人身危害风险控制在合理范围内。下图是常见的电子电气系统硬件构成图&#xff0c;一个电子电气系统的构成要素&#xff0c;除了图中可见的硬…

均值坐标参数化(MVC Parameterization)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 均值坐标定义 均值坐标定义 v0是多边形v1v2v3...vn内的一点v_0是多边形v_1v_2v_3...v_n内的一点v0​是多边形v1​v2​v3​...vn​内的一点 就会存在均值坐标ϕi(v0)ω…

腾讯云服务器CVM快速配置购买教程,新手上云必备!

腾讯云服务器快速配置购买教程是新手必备的上云教程。主机教程网在本文中以腾讯云服务器为例&#xff0c;给大家带来一个完整的、手把手教学的服务器购买流程。助力快速完成服务器的购买、配置、以及网站的搭建&#xff0c;给新手节省宝贵的时间&#xff0c;避免采坑&#xff0…

线程相关学习记录(1)

认识线程 什么是线程 进程&#xff1a; 正常电脑中启动的某个程序应用&#xff0c;并且会获得计算机分配的资源&#xff08;cpu&#xff0c;内存&#xff0c;硬件设备&#xff09; 线程&#xff1a; 进程中为了完成某个功能&#xff0c;内部划分出的不同的资源分配单位。通常…

[附源码]Python计算机毕业设计SSM基于框架的旅游管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MyBatis详细学习笔记

一、MyBatis简介 MyBatis是ORM框架&#xff0c;即对象关系映射框架。 二、搭建MyBatis 不同的MySQL版本使用的JDBC不同 com.mysql.jdbc.Driver // MySQL 5 com.mysql.cj.jdbc.Driver // MySQL 8不同版本的MySQL的url也不同 jdbc:mysql://localhost:3306/ssm // MySQL 5 jd…

神仙级Python办公自动化教程(非常详细),从零基础入门到精通,轻松玩转Excel,从看这篇开始

Excel是Office办公中使用非常频繁的一个表格制作、数据分析与图表制作的组件。随着现在数据处理量越来越大&#xff0c;日常办公中很多重复性工作耗费了广大办公人员越来越多的时间&#xff0c;那么如何才能化繁为简&#xff0c;提高办公自动化水平呢&#xff1f;借助Python中的…

【小程序】小程序中插槽使用

&#x1f4ad;&#x1f4ad; ✨&#xff1a;小程序插槽   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 没关系 天空越黑星星越亮&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0c;希望可以指正&#xff0c;非常感谢&#x1f60…

大学生个人网站作业 超简单DIV CSS个人网页成品 简单个人网站作业模板 HTML个人网页设计下载 简约黑白色个人主页

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Redis大key多key拆分方案

业务场景中经常会有各种大key多key的情况&#xff0c; 比如&#xff1a; 1&#xff1a;单个简单的key存储的value很大 2&#xff1a;hash&#xff0c; set&#xff0c;zset&#xff0c;list 中存储过多的元素&#xff08;以万为单位&#xff09; 3&#xff1a;一个集群存储了…