Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受

2023-05-16

一、Java之socket服务端

新建一个Java工程

命名

给他先创建一个类

在类里面我们做一个main

这里面也需要,创建套接字,IP号,端口号

但是java中有一个类         ServerSocket,

你在实例化        ServerSocket 的时候,

带一个整型数的构造方法,这个就是端口号

 

 我们把端口号设置为8801,

这样子就把以前的繁杂的配置结束了

 

 这面波浪线的意思,我们按下ctrl + 1

 这面波浪线的意思,我们按下ctrl + 1

 这面波浪线的意思,我们按下ctrl + 1

 这面需要try catch ,因为他可能会出错

他可能产生一个io 异常,网络连接可能产生一个受查异常

 对于受查异常,我们必须处理,要不然它编译通不过

我们做一个调试

 回忆一下我们是如何连接的

,socket对象里面有一个accept

当你能够走到这一步的时候            socket.accept();   

就说明有客户端连接上来了

 可以加一句        System.out.println("有客户端接入");        第14行

 有客户端接入的时候,我们一定要进行通信

所以这个连接通道我们要给他留着        Socket con = socket.accept();        第13行

也就是说accept的返回值,我们要给他拿出手

Socket        第13行不认识  ,我们CTRL   +      shirt    +    o  打包

接下来我们就是读取数据 

这个连接通道里面我们可以        con.getInputStream();        获取输入流,用来读取数据

这个输入流的返回值是什么呢?        InputStream in =con.getInputStream();        这个流我们要给他拿到手,拿到手就可以读取数据

我们要把读取的数据放在byte里面

 然后要在main 里面做一个数组            byte[] data = new byte[128];

 读取到数据以后,我们还得输出     

   System.out.println("读到消息:"+new String(data));        第22行
                        

 运行一下

显示套接字创建成功

 然后打开我们的网络调试助手

 先修改一下协议类型

 端口号改一下

点击一下连接,然后这面就显示        有客户端接入

 发送一句话

 另一面接受到的

后面有一堆乱码

 这些乱码的原因是因为            byte[] data = new byte[128];       data128个字节      没有初始化

我们通过data构建字符串的时候        System.out.println("读到消息:"+new String(data));   可以把没用的地方去掉

read 它的返回值是一个整形数        in.read(data);

到底读了多少个,内容是可以获得的             int len = 0;        len 的初始值我们给他弄成0

可以把   read  的返回值放在   len里面来

System.out.println("读到消息:"+new String(arg0, arg1, arg2));

 第一个参数就是我们要转化的data      ,从哪里开始  ,从第byte 里面0个字节开始   ,一直到  len

 在运行一下

 这面显示有客户端接入

 在发送一下         bingtanglizi  这句话

 结果

 但是这样有个弊端,我发送一次以后,

程序就结束了

 未结束的情况(有个红色的)

按照以前我们的经验,需要创建线程

这节课的思路:        ServerSocket这个类,这个类创造连接以后调用accept

然后连接通道里面有一个        getInputStream();

这个输入流里面有一个read     API   来读取函数

消息读出来的时候,我们要做一个byte到字符串的转换        System.out.println("读到消息:"+new String(data, 0, len));
        

二、Java之socket服务端支持多连接

上面有一个弊端,我们客户端还没断开,服务端就先断开了

 根据以前的经验,当有客户端介入的时候,我们可以创建一个子线程对接

那么accept    这面可以来一个   while   循环

 不断的连接,当有客户端新接入的时候

开辟一个线程对接            new Thread().start();

那         Thread 里面要干活是不是   

 你要干的活        InputStream in =con.getInputStream();//获取输入流,用来读取数据            
                            len = in.read(data);
                            System.out.println("读到消息:"+new String(data, 0, len));

要放在

我们要做的是con不能报错,让这个Len不能报错

我们先把        int len = 0; 搞到

因为    try    catch  以后会改变变量的作用域

然后解决data作用域的问题

 con 这面有一个解决方案

final Socket con = socket.accept();   

 我们把鼠标放在波浪线上面,还有解决方案

点击

 因为获取输入流,用来获取数据的时候,在线程里面可能会产生一些异常

 所以我们把        int len = 0;
                            byte[] data = new byte[128];
                            len = in.read(data);
                            System.out.println("读到消息:"+new String(data, 0, len));

放到try那面

 看一下思路

main函数一进来的时候,我们就创建一个套接字

·                            ServerSocket socket = new ServerSocket(8802);
                        System.out.println("socket套接字创建成功,等待连接");

套接字创建成功,我们死循环的接受客户端的接入,一但有客户端接入的时候呢,我们创建一个线程来对接,这样我就又回到循环的部分,等待客户端的接入,又有接入又要读

        

 运行一下

 只能一次发送一条消息

 想连续发就点击断开,再点击连接,一次只能发送一次

 因为我一个客户端连接读完以后,

其实单连接的线程·

public void run() {
                    // TODO Auto-generated method stub
                    InputStream in;
                    try {
                        in = con.getInputStream();
                        int len = 0;
                        byte[] data = new byte[128];
                        len = in.read(data);
                        System.out.println("读到消息:"+new String(data, 0, len));
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }//获取输入流,用来读取数据    

他已经结束了,(不让他永久的连接)

       

三、Java之socket客户端

新建一个工程来写一下,这个客户端到后面要整到androidAPP当中去

然后 

起个名字

 完成

选择这个构造方法

 第一个是Ip地址,第二个是端口号

 IP地址是        "192.168.70.1",端口号是        8801。

      

波浪线         这面需要try  catch  

    

  变成这样

要进行异常的捕获

 既然有个io 总异常捕获的话、

catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

这个可以去掉   

    catch 一个大的异常就ok了

现在就是连接上了

 连接上如何发送数据呢?

同样的     接收数据是InputStream

发送数据就是        client.getOutputStream();

它的返回值就是        OutputStream

OutputStream  out = client.getOutputStream(); 这样我们就获得了一个向外输出的通道

那向外输出,我们要输出什么数据呢?        Scanner sc = new Scanner(arg0) ;     

    ,到时候这面的东西是Android   App ,是设置好的   

,我们这面模拟的话,用键盘输入        Scanner sc = new Scanner(System.in);


            

获取一个字符串用        String message = sc.next(); 

字符串有了以后,我们是不是还要往外面发呀

我们要把我们获得的string 转化成   byte

它的返回值就是btye 这样的一个数组

 

然后我们把服务端和客户端运行一下

服务端完整的代码

 

 运行一下服务端,创建成功

轮到客户端了

端口被占用 

 

改一下端口号在运行

 我们这面需要去找一找,是哪个终端

找到以后,打出hello world  然后按一下回车

 下面就会显示

 这里面要注意next();   空格会隔断

我们还是用网络助手来试一下

 发送过去,发现空格后面没了

四、java 之 socket 客户端支持发送和接收

那我客户端和服务端已经能通信了,但是客户端只能发,也可以收

这个out是我们的发送通道,他从client这面获得       

 OutputStream  out = client.getOutputStream();        //获得数据发送通道

         

获得数据接收通道        client.getInputStream();

 那么我如何接收数据呢?

                int len;
            byte[] data = new byte[128];

通过getInputStream();的返回值

InputStream in =client.getInputStream();//获得数据接收通道、

  读到data里面来

in.read(data);

读了多少        len = in.read(data);

System.out.println("获得服务端返回数据是:"+new String(data,0, len));

现在这个客户端,可以接收,可以发送

 运行一下

这面收到的数据 

 

 然后我回复几句话

 这面接收到

 (记得网络调试助手和服务端的端口号要一样)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受 的相关文章

随机推荐

  • 实验二 连续信号的时域 MATLAB 仿真

    目录 一 实验目的 二 实验原理 三 涉及的 MATLAB 函数 四 实验内容 五 实验要求 一 实验目的 了解连续时间信号的特点 掌握一些典型连续时间信号的 MATLAB 表示方法 掌握连续时间信号时域基本运算的实现方法 xff1b 掌握
  • 实验1 MATLAB基本操作

    目录 实验目的 实验原理 MATLAB环境 MATLAB矩阵运算 MATLAB程序操作 MATLAB绘图操作 实验内容 一 矩阵操作 二 常用函数的应用 三 MATLAB程序设计 四 MATLAB绘图 实验总结 实验报告要求 实验目的 1
  • Java面试题总结-抽象类和接口的区别

    抽象类是用来捕捉子类的通用特性的 接口是抽象方法的集合 从设计层面来说 xff0c 抽象类是对类的抽象 xff0c 是一种模板设计 xff0c 接口是行为的抽象 xff0c 是一种行为的规范 想要了解抽象类和接口的区别 xff0c 我们首先
  • Ubuntu常用操作

    打开终端 Ctrl 43 Alt 43 T 查看当前目录 pwd 回到上一级目录 2 3 6 mv命令 移动文件或修改文件名 xff0c 根据第二参数类型 xff08 如目录 xff0c 则移动文件 xff1b 如为文件则重命令该文件 xf
  • 树莓派ubuntu镜像备份详细教程

    1 获取镜像 将配置好环境的树莓派sd卡放入读卡器将读卡器插入电脑在Windows操作系统上使用软件win32diskimager获取镜像将镜像保存到Linux操作系统上某个位置 xff0c 例如ubuntu22 04 2 减小镜像体积 安
  • freeRTOS面试会问到的问题。

    FreeRTOS的移植与配置以及使用 移植到哪些平台 xff0c 讲讲移植过程 xff0c 占用哪些硬件资源 可以移植到多种平台 xff0c 包括单片机 嵌入式处理器 微处理器等等 2 移植过程 xff1a 选择对应目标处理器架构的Free
  • Centos搭建配置SDN

    文章目录 赛题 1 关闭Selinux和防火墙 2 安装相关服务并上传解压安装包 安装服务 安装ODL 启动OVS 启动karaf程序 3 安装组件 测试 4 创建拓扑 5 下发流表 6 启动HTTP Server功能 7 更多内容 赛题
  • 【多任务学习-Multitask Learning概述】

    多任务学习 Multitask Learning概述 1 单任务学习VS多任务学习多任务学习的提出多任务学习和单任务学习对比 2 多任务学习共享表示shared representation xff1a 多任务学习的优点那么如何衡量两个任务
  • DHT11原理总结

    DHT11 DHT11是一款数字温湿度传感器具有极高的可靠性 xff0c 卓越的长期稳定性 xff0c 当进行完校准后 xff0c 校准系数以程序的形式存在OTP内存中 xff0c 传感器内部在检测型号的处理过程中要调用这些校准系数 单线制
  • Ubuntu中使用john the ripper口令破解

    一 创建新用户 登录到root用户 如果已有root用户可跳过本步骤 xff08 如果你之前有设置过root用户 xff0c 那就通过以下命令更改密码 xff09 sudo passwd root 然后登陆root su root 创建新用
  • UNIX文件权限详解(尤其是SUID和SGID)

    SUID UNIX下关于文件权限的表示方法和解析 SUID UNIX下可以用ls l 命令来看到文件权限 用ls命令所得到的表示法的格式是类似这样的 xff1a rwxr xr x 下面解析一下格式所表示的意思 xff0c 这种表示方法一共
  • 【C语言】51单片机计算器(LCD1602液晶显示)

    1 设计目标 设计可选模式的计算器 2 主要功能 功能一 xff1a 可选两种计算模式 xff0c 模式一为四则运算 xff0c 模式二为扩展内容 xff1b 功能二 xff1a 除法的计算结果保留到小数点后四位 xff1b 功能三 xff
  • [已解决]ssh连接报:Bad owner or permissions on C:\\Users/XXX/.ssh/config

    之前都可以正常连 xff0c 今天突然不行 经过反复折腾 xff0c 终于搞好了 总结经验如下 xff1a 方法一 xff1a 1 设置 ssh文件的文件权限 ssh chmod R 600 文件名 R xff1a recursive 可递
  • 二维数组的地址,以及二维数组的地址写法 , 数组指针,数组指针和二维数组的配合应用

    1 二维数组的地址 int a 3 4 61 1 xff0c 3 xff0c 5 xff0c 7 9 xff0c 11 xff0c 13 xff0c 15 17 xff0c 19 xff0c 21 xff0c 23 a是二维数组名 数组的
  • linux:exec族函数, exec族函数配合fork使用,system 函数,popen 函数

    1 exec族函数 精彩博文 xff1a https blog csdn net u014530704 article details 73848573 path 比如说 a out arg 比如以前的cp demo11 c demo12
  • Linux:网络编程

    1 概述 2 字节序 双字的意思 xff1a 一个字节八位 两个字节就是三十二位 一个十六进制要用四个二进制表示 对内存来说 xff0c 一个字节可以存放01 01 放一个字节 xff0c 02放一个字节 xff0c 03放一个字节 xff
  • Java:高级之泛型概念引入,泛型可以设置多个类型参数,泛型继承和泛型接口实现,限制泛型可用类型,泛型通配的方式,泛型方法,泛型方法限制泛型可用类型

    目录页 泛型简介 泛型类 限制泛型可用类型 类型通配声明 泛型方法 问题引入 如果我们需要产生多个对象 xff0c 每个对象的逻辑完全一样 xff0c 只是对象内的成员变量的类型不同 那我们如何去做 xff1f 我们新建一个工程 做一个构造
  • Android:安卓工程结构介绍

    一 安卓的工程目录文件夹介绍 src 存放Java代码的 xff0c 有包 xff0c 有文件 gen 存放自动生成的文件 关心的是R java xff0c 程序页面 xff0c 按键 xff0c 文本等空间的ID Android 4 4
  • Android:页面跳转传参方式一,页面跳转传参方式二

    一 页面跳转传参方式一 跳转的过程如何传参 xff1a 也就是页面之间如何传递参数 xff0c 有点像函数调用如何传参 xff0c 页面跳转也要传参 复制一个工程 你要跳转 xff0c xff08 现在的代码如下 xff09 xff0c i
  • Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受

    一 Java之socket服务端 新建一个Java工程 命名 给他先创建一个类 在类里面我们做一个main 这里面也需要 xff0c 创建套接字 xff0c IP号 xff0c 端口号 但是java中有一个类 ServerSocket xf