【Java】学习路径55-练习:制作一个聊天室(多线程、UDP、双向传输数据)
创建四个类,实现双向聊天的功能。
接收线程:
import java.io.IOException;
import java.net.*;
public class ReceiveThread implements Runnable{
private int port;
public ReceiveThread (int port){
this.port=port;
}
@Override
public void run() {
DatagramSocket ds = null;//如果要监听,则在构造的时候就要指定需要监听的端口。
try {
ds = new DatagramSocket(port);
while(true){
byte[] buf = new byte[1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf,length);
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
String str = new String(dp.getData(),0,dp.getLength());
InetAddress ip = dp.getAddress();
System.out.println("来自:"+dp.getSocketAddress()+"的信息\n"+str+"\n-----------");
}
} catch (SocketException e) {
e.printStackTrace();
}finally {
ds.close();
}
}
}
发送线程:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class SendThread implements Runnable{
private int port;
public SendThread (int port){
this.port=port;
}
@Override
public void run() {
DatagramSocket ds = null;
try {
ds = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while(true){
// byte[] buf = "我是王二萌remoo,你也可以叫我remoo".getBytes();
String str = sc.next();
if(str.equals("end"))break;
byte[] buf = str.getBytes();
int length = buf.length;
InetAddress ip = null;
try {
ip = InetAddress.getByName("localhost");
} catch (UnknownHostException e) {
e.printStackTrace();
}
DatagramPacket dp = new DatagramPacket(buf,length,ip,port);
try {
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
}
ds.close();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
用户1:
public class Chat_User01 {
public static void main(String[] args) {
//用户1的接收端线程启动
ReceiveThread rt = new ReceiveThread(8898);
new Thread(rt).start();
//用户1的发送端口线程
SendThread st = new SendThread(8899);
new Thread(st).start();
}
}
用户2:
public class Chat_User02 {
public static void main(String[] args) {
//用户2的接收端线程启动
ReceiveThread rt = new ReceiveThread(8899);
new Thread(rt).start();
//用户1的发送端口线程
SendThread st = new SendThread(8898);
new Thread(st).start();
}
}
然后启动用户1、用户2:
【Java】学习路径55-练习:制作一个聊天室(多线程、UDP、双向传输数据)的更多相关文章
- node+express+socket.io制作一个聊天室功能
首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...
- Android学习笔记(十二)——实战:制作一个聊天界面
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...
- Java学习路径及练手项目合集
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...
- Java学习路径(抛光砖)
这就是我刚刚在五孔问答中找到的Java学习路线图抛光砖价格.我个人认为,这条Java学习路线是可以的.它是2018年相对较新的Java学习路线,更符合企业就业标准. Java学习路径的第一阶段:Jav ...
- 基于react+react-router+redux+socket.io+koa开发一个聊天室
最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...
- 使用原生node写一个聊天室
在学习node的时候都会练习做一个聊天室的项目,主要使用socket.io模块和http模块.这里我们使用更加原始的方式去写一个在命令行聊天的聊天室. http模块,socket.io都是高度封装之后 ...
- 利用socket.io构建一个聊天室
利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊. socket.io 这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了.其实主要用的东西 ...
- java web利用mvc结构实现简单聊天室功能
简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...
- 使用 NIO 搭建一个聊天室
使用 NIO 搭建一个聊天室 前面刚讲了使用 Socket 搭建了一个 Http Server,在最后我们使用了 NIO 对 Server 进行了优化,然后有小伙伴问到怎么使用 Socket 搭建聊天 ...
随机推荐
- make 随笔
# --with--cc-opt flag导致./configure时找不到对应库文件? checking for --with-ld-opt="-Wl,-z,relro -Wl,-z,no ...
- Node.js精进(3)——流
在 JavaScript 中,一般只处理字符串层面的数据,但是在 Node.js 中,需要处理网络.文件等二进制数据. 由此,引入了Buffer和Stream的概念,两者都是字节层面的操作. Buff ...
- Array 数组filter()方法,遍历数组返回符合条件的一个新数组
<script> const arr = [ { id: 1, name: "aa", isDone: false }, { id: 2, name: "bb ...
- exe4j下载和使用
https://blog.csdn.net/weixin_44678104/article/details/101015065
- Tapdata 实时数据融合平台解决方案(一):现代企业数据架构及痛点
作者介绍:TJ,唐建法,Tapdata 钛铂数据 CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. "怎样可以来搭建一个数据中台? ...
- JAVA中计算两个日期时间的差值竟然也有这么多门道
上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...
- Linux shell脚本进阶使用
shell的循环控制语句 - continue:提前结束某次循环,重新开始下一次 - break:提前结束某层循环 范例: #求100以内的奇数和 #!/bin/bash sum=0 for i in ...
- @PostConstruct +getapplicationcontext.getbean springboot获取getBean
Componentpublic class SpringContextUtils implements ApplicationContextAware { public static Applicat ...
- umask计算创建文件、目录的默认权限
很多人以为 创建文件默认权限就是 666-umask=创建文件的默认权限 创建目录的默认权限就是 777-umask=创建目录的默认权限 这种计算其实是不严谨的 为什么我们创建的文件的权限是 64 ...
- C++学习记录1
代码1:转义字符 点击查看代码 #include<iostream> using namespace std; void test01()//换行 { cout << &quo ...