java 聊天 两个进程互相通信开两个线程
简介
RT
code
server
package com.kuang;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by lee on 2021/4/1.
*/
public class UdpServer {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runnable r1 = new Runnable() { // 发送
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
@Override
public void run() {
// TODO Auto-generated method stub
try {
DatagramSocket ds = new DatagramSocket(9999);
String s = null;
System.out.print("输入:");
while ((s = br.readLine()) != null) {
DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length,
InetAddress.getByName("127.0.0.1"), 10000);//广播
ds.send(dp);
if(s.equals("quit")) {
ds.close();
break;
}
// System.out.print("输入:");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable r2=new Runnable() { //接收
@Override
public void run() {
// TODO Auto-generated method stub
try {
DatagramSocket ds=new DatagramSocket(10001);
byte[] buff=new byte[1024];
DatagramPacket dp=new DatagramPacket(buff,buff.length);
while(true) {
ds.receive(dp);
String s = new String(dp.getData(),0,dp.getLength());
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println("消息:"+ip+" "+port+" : "+s);
if(s.equals("quit")) {
ds.close();
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
ExecutorService es= Executors.newFixedThreadPool(2);
es.submit(r1);
es.submit(r2);
}//main
}
client
package com.kuang;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by lee on 2021/4/1.
*/
public class UdpClient {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runnable r1 = new Runnable() { // 发送
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
@Override
public void run() {
// TODO Auto-generated method stub
try {
DatagramSocket ds = new DatagramSocket(10002);
String s = null;
System.out.print("输入:");
while ((s = br.readLine()) != null) {
DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length,
InetAddress.getByName("127.0.0.1"), 10001);//广播
ds.send(dp);
if(s.equals("quit")) {
ds.close();
break;
}
// System.out.print("输入:");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable r2=new Runnable() { //接收
@Override
public void run() {
// TODO Auto-generated method stub
try {
DatagramSocket ds=new DatagramSocket(10000);
byte[] buff=new byte[1024];
DatagramPacket dp=new DatagramPacket(buff,buff.length);
while(true) {
ds.receive(dp);
String s = new String(dp.getData(),0,dp.getLength());
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println("消息:"+ip+" "+port+" : "+s);
if(s.equals("quit")) {
ds.close();
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
ExecutorService es= Executors.newFixedThreadPool(2);
es.submit(r1);
es.submit(r2);
}//main
}
java 聊天 两个进程互相通信开两个线程的更多相关文章
- Python_架构、同一台电脑上两个py文件通信、两台电脑如何通信、几十台电脑如何通信、更多电脑之间的通信、库、端口号
1.架构 C/S架构(鼻祖) C:client 客户端 S:server 服务器 早期使用的一种架构,目前的各种app使用的就是这种架构,它的表现形式就是拥有专门的app. B/S架构(隶属于C/ ...
- Qt中跨进程Socket通信以及socket跨线程通信
一 QTcpServer 创建流程 创建套接字服务器 QTcpServer 对象, 通过 QTcpServer 对象设置监听,即:QTcpServer::listen() 基于 QTcpServer: ...
- 本地启动服务,两个进程分别监听两个端口,导致两个 URL 不同
问题描述: 本地启了两个服务:A(http://localhost:8001) B(http://localhost:8000),A 项目要怎么才能关联到 B 项目,也就是 A 项目请求怎么跳到 B ...
- Unix系统中,两个进程间的通信
进程之间通常需要进行数据的传输或者共享资源等,因此进程间需要通讯. 可以通过管道,信号,消息队列,共享内存,信号量和套接字等方式 FIFO表示命名管道,这种管道的操作是基于先进先出原理. PIPE 表 ...
- C# 调用Windows API实现两个进程间的通信
使用Windows API实现两个进程间(含窗体)的通信http://blog.csdn.net/huangxinfeng/article/details/5513608 从C#下使用WM_COPYD ...
- linux 两个进程通过 共享内存 通信例子
例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...
- [Java聊天室server]实战之五 读写循环(服务端)
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...
- java创建多线程&创建进程
概述 并发和并行是即相似又有区别: 并行:指两个或多个事件在同一时刻发生: 并发:指两个或多个事件在同一时间段内发生. 进程是指一个内存中运行中的应用程序.每个进程都有自己独立的一块内存空间,一个应用 ...
- 2016-2017-2 《Java程序设计》教学进程
2016-2017-2 <Java程序设计>教学进程 目录 考核方式 课前准备 教学进程 第00周学习任务和要求 第01周学习任务和要求 第02周学习任务和要求 第03周学习任务和要求 第 ...
- Java并发编程:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
随机推荐
- Sentinel源码—1.使用演示和简介
大纲 1.Sentinel流量治理框架简介 2.Sentinel源码编译及Demo演示 3.Dashboard功能介绍 4.流控规则使用演示 5.熔断规则使用演示 6.热点规则使用演示 7.授权规则使 ...
- AI实战:Text_To_SQL+Prompt+数据库(MySQL)+MCP
一.Text-to-SQL应用概述 什么是Text-to-SQL?Text-to-SQL也称为NL2SQL,是将自然语言查询转换为可在关系数据库上执行的SQL查询的技术. 其核心目标是准确捕捉并反映用 ...
- 判断属性值,选择性执行下一步(get element attribute指令的用法)
应用场景: 下图线下支付,在退款前需要勾选这种支付方式,否则无法实现支付. 如果在测试脚本内即加入勾选指令,那么在下次执行的时候就会再次勾选,从而造成去除勾选的操作 对比一下勾选前后,勾选框元素内容组 ...
- WPF封装一个懒加载下拉列表控件(支持搜索)
因为项目中PC端前端针对基础数据选择时的下拉列表做了懒加载控件,PC端使用现成的组件,为保持两端的选择方式统一,WPF客户端上也需要使用懒加载的下拉选择. WPF这种懒加载的控件未找到现成可用的组件, ...
- 创建mysql容器
docker run -d --name node2 -e "container=docker" --privileged=true new/centos_sshd /usr/ ...
- 小程序自定义组件 - 插槽slot
和 vue 的 slot 几乎是一模一样的. 这个学小程序就相当于复习了一把 vue, 还是很值的. 我们之前说组件是页面的一部分, 目的是为了代码复用, 作为组件封装者, 有时候需要设计一些让用户能 ...
- 实现高质量视频通话的javascript技巧与方法
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- 5 easybr指纹浏览器内存修改教程
目的 navigator.deviceMemory可以暴露设备的物理内存和运行状态,被用于设备唯一性识别或判断设备等级. 通过伪造这类信息,可以增强防关联.防追踪能力. easybr指纹浏览器提供演示 ...
- TenantLineInnerInterceptor源码解读
一.引言 TenantLineInnerInterceptor是MyBatis-Plus中的一个拦截器类,位于com.baomidou.mybatisplus.extension.plugins.in ...
- Nmap 从入门到精通:详细指南
Nmap 从入门到精通:详细指南 1. Nmap 是什么? Nmap(Network Mapper)是一款开源的网络探测和安全审计工具,广泛用于以下场景: 主机发现:识别网络中的活动设备. 端口扫描: ...