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的杂货小窝 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一 ...
随机推荐
- FastAPI中的依赖注入与数据库事务管理
title: FastAPI中的依赖注入与数据库事务管理 date: 2025/04/09 00:10:29 updated: 2025/04/09 00:10:29 author: cmdragon ...
- luaL_ref如何使用
// main.lua中有个全局函数function gf() print("hello world")end// c++中处理void callgf(){ lua_getglob ...
- C#之集合常用扩展方法与Linq
一.集合的常用扩展方法(lambda的方式) 1.Where() 根据条件选择数据 2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类 3.Max() 根据条件选择最大值 4.M ...
- python发送QQ邮件,自定义邮件内容
怎么发QQ邮件,网上的例子很多,就不介绍了,具体可参考:https://www.jianshu.com/p/0f8c5e4e7054 这里主要把自定义邮件内容写一下 # -*- coding: utf ...
- pytorch 实战教程之路径聚合网络PANet(Path AggregationNetwork)代码实现 PANet原理详解
原文作者:aircraft 原文链接:pytorch 实战教程之路径聚合网络PANet(Path AggregationNetwork)代码实现 PANet原理详解 学习YOLOv5前的 ...
- Java 里的对象在虚拟机里面是怎么存储的?
Java 中的对象在虚拟机里的存储 在 Java 中,对象在虚拟机中的存储方式取决于 JVM 内存模型,主要存储在 堆(Heap) 中.对象的内存布局和管理方式会影响对象的创建.访问和销毁.下面详细解 ...
- x86花指令
花指令 参考: https://bbs.kanxue.com/thread-279604.htm#msg_header_h3_21 两种反编译算法 线性扫描算法:逐行反汇编(无法将数据和内容进行区分) ...
- 基于Kubernetes可扩展的Selenium 并行自动化测试部署及搭建(1)——Win10环境下Docker部署
前言: 最近逛swtestacademy时候发现一篇基于kubernetes搭建selenium并行自动化测试的帖子,主要描述的是通过k8s动态扩展selenium grid来实现自动化测试用例在不同 ...
- 后缀数组(SA)
后缀数组 P3809 [模板]后缀排序 定义: 对给定字符串的所有后缀排序后得到的sa.rk数组 sa[i]->排名为i的后缀的位置 rk[i]->位置为i的后缀的排名 容易发现,sa与r ...
- HeapSter部署
pod资源需求,资源限制 Requests:需求,最低保障: Limits: 限制,硬限制: Limits >= request CPU: 1颗虚拟CPU=1000 毫核心 millicores ...