java实现聊天,服务端与客户端代码(UDP)-狂神改
首先是文件结构:

最后run的是下面两个
代码用的狂神的,不过他写的有点小bug,比如传信息会出现一堆空格(recieve data那里长度不应该用data.lenth()而应该用packet.getLenth()),
以及你输入退出关键词后,会同时把两边都close掉,虽然好像也可以这样不过怪怪的,于是我分开了
在这里用/exit作为退出关键词。输入后,输入方直接exit(0),接收方此时会收到“对方已下线”的提醒,这时候也可以输入/exit退出。
ok接下来是代码:
1.TalkRecieve
package socket.chat; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; import static java.lang.System.exit; public class TalkRecieve implements Runnable{ DatagramSocket socket = null;
private int port;
private String msgFrom; public TalkRecieve(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[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
socket.receive(packet);//等待接受包裹
//断开连接
byte[] data = packet.getData();
String receiveData = new String(data,0,packet.getLength());
System.out.println(msgFrom+":"+receiveData);
if(receiveData.equals("/exit")){
System.out.println("【系统】:对方已下线。使用/exit退出");
break; } }catch (IOException e){
e.printStackTrace(); }
}
socket.close(); }
}
2.TalkSend
package socket.chat; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress; import static java.lang.System.exit; 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(Exception e){
e.printStackTrace();
} } @Override
public void run() { //准备数据,控制台读取 while(true){
try{
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort)); socket.send(packet);
if(data.equals("/exit")) {
break;
}
}catch(Exception e){
e.printStackTrace();
} }
socket.close();
exit(0);
}
}
3.TalkStudent(一方)
package socket.chat;
//学生从7777发出,发向对方的9999
//学生准备从8888接收老师的消息
//从哪里发出并不重要,重要的是发向哪里和接收在哪里
public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkSend(7777,"localhost",9999)).start();
new Thread(new TalkRecieve(8888,"老师")).start();
}
}
4.TalkTeacher(另一方)
基本一致,只是send的port和reiceve的prot换了
这里发送来源port是无所谓的(只要别填个会被占用的就行了)
package socket.chat;
//学生从7777发出,发向对方的9999
//学生准备从8888接收老师的消息
//从哪里发出并不重要,重要的是发向哪里和接收在哪里
public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkSend(7777,"localhost",9999)).start();
new Thread(new TalkRecieve(8888,"老师")).start();
}
}
java实现聊天,服务端与客户端代码(UDP)-狂神改的更多相关文章
- 基于java NIO 的服务端与客户端代码
在对java NIO selector 与 Buffer Channel 有一定的了解之后,我们进行编写java nio 实现的 客户端与服务端例子: 服务端: public class NIOC ...
- TCP通信服务端及客户端代码
Java TCP通信使用的是Socket(客服端)和ServerSocket(服务端),具体代码如下. server端代码: import java.io.BufferedReader; import ...
- TCP通信聊天服务端和客户端(C/C++语言开发)附完整源码
距离上次学Python写的Python实现简单聊天室已经过去好久了,现在学c++又写了一遍,其实过程差不多,无非是语法的变化,目前仅实现最简单的一对一的通信,然后改就是了,接下来应该是多线程了,话不多 ...
- socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例
socket模块 serSocket.setblocking(False) 设置为非阻塞: #coding=utf-8 from socket import * import time # 用来存储所 ...
- java socket实现服务端,客户端简单网络通信。Chat
之前写的实现简单网络通信的代码,有一些严重bug.后面详细写. 根据上次的代码,主要增加了用户注册,登录页面,以及实现了实时显示当前在登录状态的人数.并解决一些上次未发现的bug.(主要功能代码参见之 ...
- [C语言]一个很实用的服务端和客户端进行UDP通信的实例
前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中.“裸写”socket老是记不住步骤,经常被鄙视…… 下面的例子很简单,写一个UDP的server用于收包 ...
- java环信服务端注册IM代码
下载环信api代码 https://github.com/easemob/emchat-server-examples 里面包含各种语言版本,我只下载了java版emchat-server-java ...
- JAVA笔记15__TCP服务端、客户端程序 / ECHO程序 /
/** * TCP:传输控制协议,采用三方握手的方式,保证准确的连接操作. * UDP:数据报协议,发送数据报,例如:手机短信或者是QQ消息. */ /** * TCP服务器端程序 */ public ...
- gSOAP calc服务端与客户端示例
1. Web服务定义描述头文件 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double &a ...
- Java 断点下载(下载续传)服务端及客户端(Android)代码
原文: Java 断点下载(下载续传)服务端及客户端(Android)代码 - Stars-One的杂货小窝 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一 ...
随机推荐
- 一文带你深度剖析什么叫Transformer
Transformer概述 Transformer是基于自注意机制(self-attention)的神经网络模型.其经常用于来处理时序数据.我们知道还有另外的常用的两类深度神经网络模型循环神经网络(R ...
- PHP实现文件上传下载实例详细讲解
一.上传原理与配置 1.1 原理 将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可. 1.2 客户端配置 所需:表单页面(选择上传文件): 具体而言:发送方式为POST,添 ...
- 10个 DeepSeek 神级提示词,建议收藏!
在当下人工智能飞速发展的时代,DeepSeek 作为一款功能强大的 AI 工具,能够帮助我们实现各种创意和需求.然而,要充分发挥它的潜力,掌握一些巧妙的提示词至关重要.今天,就为大家精心整理了 15 ...
- 【经验】Word 2021|如何在Word里做出和Markdown中一样漂亮的引用样式(结尾附成品)
文章目录 写在最前 方法以及参数 1 打开样式窗口 2 设置一些基本操作 3 打开格式窗口 4 修改样式 最后一步!保持间隔 成品的介绍(一些自卖自夸)+获取链接(不想看做法的话直接下载) 写在最前 ...
- Font Awesome文档使用手册
Font Awesome 字体为您提供可缩放矢量图标,它可以被定制大小.颜色.阴影以及任何可以用CSS的样式. 使用文档:https://fa4.uihtm.com/ Font Awesome 是一套 ...
- storageclass和本地持久化存储
StorageClass 之前我们部署了PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上 ...
- MCP 实践系列:股票分析
今天,我们介绍了一个通过 Financial Datasets 获取股票市场数据的接口.这个接口不仅支持其他 AI 助手通过 MCP 接口 直接检索关键的财务数据(如损益表.资产负债表.现金流量表), ...
- HarmonyOS数据防泄漏服务(DLP)开发实战
系统级数据防护的核心能力解析 在企业级文档管理.教育课件分发.金融合同处理等场景中,数据泄露风险贯穿文件生命周期.HarmonyOS提供的数据防泄漏服务(DLP),通过沙箱隔离.端云协同认证.细粒度权 ...
- TVM: 编译深度学习模型的快速入门教程
支持的TVM硬件后端概述 下图显示了 TVM 目前支持的硬件后端: 在本教程中,将选择 cuda 和 llvm 作为目标后端.首先,让导入 Relay 和 TVM. import numpy as n ...
- AWK用法全解
一.awk介绍 awk是Linux自带的一个逐行扫描的文本处理工具,支持正则表达式.循环控制.条件判断.格式化输出.AWK自身带有一些变量,可以在书写脚本时调用. 二.基本语法格式 2.1.在shel ...