TCP、UDP API调用(实时聊天)

news2024/12/25 9:28:56

1. TCP连接

在这里插入图片描述
服务器创建ServerSocket,并指定端口进行监听;
ServerSocket通过accept()接受用户请求并返回Socket,否则一直处于监听状态,线程阻塞;
客户端创建Socket,需要指定服务器的ip和端口,向服务器发送连接请求。

连接建立以后,客户端发送数据需要输出流,接受数据需要输入流,服务器也一样。

客户端

连接服务器Socket
发送消息

//客户端
public class TcpClientDemo01 {
    public static void main(String[] args) {
        try {
            //1.我要知道服务器的地址,端口号
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //2.创建一个socket连接
            Socket socket = new Socket(serverIP, port);
            //3.发送消息IO流
            OutputStream os = socket.getOutputStream();
            os.write("你好,欢迎学习java".getBytes());
            os.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

服务器

建立服务器端口ServerSocket
等待用户连接
接收用户消息

//服务端
public class TcpServerDemo01 {
    public static void main(String[] args) {
        try {
            //1.我要有一个地址
            ServerSocket serverSocket = new ServerSocket(9999);
            //2.等待客户端连接
            Socket socket = serverSocket.accept();
            //3.读取客户端消息
            InputStream is = socket.getInputStream();
            //管道流,用来输出客户端传来的东西
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            if ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            System.out.println(baos.toString());
            baos.close();
            is.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. UDP

发短信:不用连接,需要知道对方的地址!

发送方

//发送方
public class UdpSendDemo01 {
    public static void main(String[] args) throws Exception {
        //1.建立一个数据socket
        DatagramSocket socket=new DatagramSocket();
        //2.要发给谁
        InetAddress localhost=InetAddress.getByName("localhost");
        int port=9090;
        //3.建一个包
        String str="你好啊,服务器~";
        //数据,数据的开始,结束,要发给谁
        DatagramPacket packet=new DatagramPacket(str.getBytes(),0,str.getBytes().length,localhost,port);
        //4.发送
        socket.send(packet);
        //5.关闭
        socket.close();
    }
}

接收方

//接收方,还是要等待别人给发送!随时都在线监听
public class UdpReceiverDemo01 {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket=new DatagramSocket(9090);
        //接收数据包
        byte[] buffer=new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);//接收
        //接收
        socket.receive(packet);
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getData().length));
        //关闭
        socket.close();
    }
}

循环发送消息

public class UdpSenderDemo01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(8888);
        //准备数据:读取控制台输入
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            String data = reader.readLine();
            byte[] bts = data.getBytes();
            DatagramPacket packet = new DatagramPacket(bts, 0, bts.length, new InetSocketAddress("localhost",6666));
            socket.send(packet);
            if (data.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

循环接收消息

public class UdpReceiverDemo01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(6666);
        while (true) {
            //准备接收包
            byte[] bts = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bts, 0, bts.length);
            socket.receive(packet);
            //断开连接
            byte[] data=packet.getData();
            String receivedata = new String(data, 0, data.length);
            System.out.println(receivedata);
            if (receivedata.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

3. 在线咨询:两个人都可以是发送方或者接收方!

先创建两个工具类,一个用来发送消息,一个用来接收消息,并且都是单独的线程(实现线程接口)
创建两个聊天的人,这两个人都有发送和接收功能。

发送线程

public class TalkSend implements Runnable { //实现线程接口
    DatagramSocket socket = null;
    BufferedReader reader = null;
    private int fromPort;
    private String toIP;
    private int toPort;
    public TalkSend(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
        try {
            socket = new DatagramSocket(fromPort);
            //准备数据:读取控制台输入
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while (true) {
            try {
                String data = reader.readLine();
                byte[] bts = data.getBytes();
                DatagramPacket packet = new DatagramPacket(bts, 0, bts.length, new InetSocketAddress(this.toIP, this.toPort));
                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

接收线程

public class TalkReceive implements Runnable {
    DatagramSocket socket = null;
    private int port;
    private String msgFrom;
    public TalkReceive(int port, String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while (true) {
            try {
                //准备接收包
                byte[] bts = new byte[1024];
                DatagramPacket packet = new DatagramPacket(bts, 0, bts.length);
                socket.receive(packet);
                //断开连接
                byte[] data = packet.getData();
                String receivedata = new String(data, 0, data.length);
                System.out.println(msgFrom + ":" + receivedata);
                if (receivedata.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

学生端

public class TalkStudent {
    public static void main(String[] args) {
        //开启两个线程
        //执行发送
        new Thread(new TalkSend(7777,"localhost",9099)).start();
        //接收
        new Thread(new TalkReceive(8888,"老师")).start();
    }
}

老师端

public class TalkTeacher {
    public static void main(String[] args) {
        //执行发送
        new Thread(new TalkSend(5555,"localhost",8888)).start();
        //接收
        new Thread(new TalkReceive(9099,"学生")).start();
    }
}

来源:https://www.kuangstudy.com/bbs/1451008930120585218
https://blog.csdn.net/qq_41532872/article/details/85786214

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

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

相关文章

OpenGL之纹理映射

1.1 Texture Mapping 1.1.1 在OpenGL编程中,应用纹理主要分为四步: 创建纹理对象,并为它装载一个纹理; glGenTexture(1,&texName); //为每个纹理编号,1代表生成一个编号 glBindTexture(GL_TEXTURE_2D,texNam…

一道题学习node.js中的CRLF注入

前言 这几天刷题遇到在node.js题目中注入CRLF实现ssrf的题目,对于我来说知识听新颖。在此记录一下。 CRLF注入 学习过http请求走私漏洞的师傅对于这个CRLF肯定不会陌生。所谓的CRLF就是回车加换行。常用于http数据包。字段之间用一个CRLF分割,首部和主…

【MySQL篇】约束语法及演示总结(全)

目录 理解约束: 约束语法及添加、删除约束语法: 约束总览: ​1、非空约束 2、唯一约束 3、主键约束 4、默认约束 5、外键约束 案例演示: 加深格式记忆: 理解约束: 约束实际上就是我们对表中数据的…

Redis命令及原理学习(一)

redis介绍 redis 是 Remote Dictionary Service 的简称;也是远程字典服务; 节点 通过tcp与redis建立连接交互请求回应模型 redis是一种内存数据库:数据都在内存中。redis是一种kv数据库: 存储方式操作方式 redis是一种数据结构数…

【访谈】Eotalk Vol.05: API 全生命周期管理,如何解决企业 API 安全问题

Eotalk 是由 Eolink 和各合作方一起发起的泛技术聊天活动,每期我们会邀请一些技术圈内的大牛聊聊天,聊一下关于技术、创业工作、投融资等热点话题。 本期 Eotalk 我们邀请到的嘉宾是来自星阑科技的 CTO 徐越~ 👏👏 徐越是一位 90…

红黑树(4万字文章超详细,只为一个目的)

我写这篇文章的主要目的其次才是积累知识,主要是因为我想打一个同学的脸. 事情是这样的.我现在中学嘛,我们班上有一个同学他学了红黑树啊,就一副"不可一世"的样子.在我面前炫耀啊.当时我就想立马打他的脸,可是我有没有实力,所以才学习红黑树学到深夜,写了篇博客.言归…

深度解析:会用Excel,还有必要学Python吗?

前言 某站上有个问题: 我都会用Excel了,还有必要学Python吗? (文末送读者福利) 这个问题大概率可以说明问这个问题的这位同学目前还没有遇到非Python不可的场景,之所以产生了学Python的念头是因为这两年P…

今日分享:文字转语音软件哪个好

如今已经进入到了一个短视频时代,大家饭后或者闲暇时都会通过刷视频来消磨时间,而部分小伙伴看到一些有趣的内容,也想试着自己制作一下。但众所周知,视频拍摄容易,后期剪辑制作确实异常困难的,有许多道工序…

从boot引导到loader引导完整运行

此文针对该文章对loader引导进行了完善后的完整运行过程。(具体细节请参见下文) boot引导升级,成功引导运行loader_What’smean的博客-CSDN博客boot引导升级,成功引导运行loaderhttps://blog.csdn.net/weixin_42492218/article/d…

【数据结构】11道LeetCode链表OJ练习

文章目录1. 移除链表元素2. 反转链表3. 链表的中间节点4. 链表中倒数第k个节点5. 合并两个有序链表6. 链表分割7. 链表的回文结构8. 相交链表9. 环形链表10. 环形链表II11. 复制带随机指针的链表补充内容:浅谈顺序表和链表的区别1. 移除链表元素 移除链表元素OJ链接…

扫雷游戏优化详解——c语言实现

文章目录 一、扫雷游戏的简单认识与解释 二、扫雷游戏的代码及思路实现 一、扫雷游戏的思路 1、菜单打印 2、创建扫雷区 3、初始化雷区 4、打印雷区 5、布置雷区 6、排雷 三、扫雷游戏代码的整合 game.h game.c test.c 标题:猜数字小游戏 作者:Ggggg…

你适合考PMP还是软考?两者的区别是否清楚,分别能给你带来什么价值

PMP与软考之间有什么区别,应该考哪个更适合自己? 下面从9个方面给大家简单的介绍做一个对比,希望能帮上忙~ 软考和PMP哪个更适合自己? 01 考试介绍 PMP:PMP是项目管理专业人士资格认证,由美国项目管理协…

腾讯云相同配置8核16G的云服务器和轻量服务器该如何选择?

很多个人或者中小企业用户在选择云服务器的时候,已经确认配置的情况下,去选购的时候发现有出现了轻量应用服务器,那么轻量应用服务器和云服务器又有哪些区别,价格为啥又有那么大的差别,该如何选择呢? 从上边…

SSM框架整合详细教程

目录 1. 什么是SSM? 2. SSM整合的时候容器之间如何访问 3. SSM下面的开发步骤 4. SSM整合时候时容易混乱的知识点 1. 什么是SSM? SSM是对三个框架名字的简写,其中第一个S指的是SpringMVC,第二个S指的是Spring,第三个M指的是M…

项目搭建(七)爱心代码❤网站部署(静态网站)

爱心代码❤网站部署(静态网站)一、环境基础二、修改Tomcat启动配置三、放置静态网站四、启动Tomcat一、环境基础 如果你已经部署了Apache-Tomcat,恭喜你,你已经完成90%的部署工作 如果没有tomcat,那你先部署tomcat吧 …

4_单机优化(确定性算法,优化框架)

优化框架机器学习的优化框架正则化经验风险最小化优化算法的收敛速率假设条件凸函数定义强凸函数定义光滑函数定义优化算法的分类机器学习的优化框架 正则化经验风险最小化 有监督的机器学习问题: 假设输入输出数据 Sn{(xi,yi);i1,...,n}S_n \left\{(x_i, y_i);…

C++与C语言中的字符串

目录 1、关于c语言中的字符串 (1)c语言中字符串与字符指针 (2)字符串结尾 2、关于c中的字符串string (1)从本质上了解string (2)c中的字符串转换与关联 (3&#x…

【MySQL入门指北】MySQL备份及恢复

MySQL备份及恢复 文章目录MySQL备份及恢复1.Percona 介绍2.安装Percona 需要的 MySQL 包3.安装percona-xtrabackup4.完全备份流程5.完全恢复流程6.增量备份流程7.差异备份8.差异恢复流程9.记录的导入和导出10.mysqldumpbinlog11.MySQL恢复数据12.二进制日志恢复13.误删除库的问…

基于51单片机的室内温度可燃气体检测报警系统Proteus仿真

资料编号:133 下面是相关功能视频演示: 133-基于51单片机的室内温度可燃气体检测报警系统Proteus仿真(源码仿真全套资料)功能介绍: 采用51单片机作为主控,LCD1602显示当前温度和可燃气体浓度,…

Netty源码阅读(1)之——客户端源码梗概

目录 准备 开始 NioSocketChannel 的初始化过程 指定 初始化 关于unsafe属性: 关于pipeline的初始化 小结 EventLoopGroup初始化 小结 channel的注册过程 handler的注册过程 客户端连接 总结 准备 源码阅读基于4.1.84.Final版本。从github下载netty项目…