Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端
代码内容
- 采用UDP协议编写服务器端代码(端口任意)
- 编写客户机的代码访问该端口
- 客户机按行输入
- 服务器将收到的字符流和接收到的时间输出在服务器console
- 原样返回给客户机在客户机console显示出来
代码实现
/* UDPEchoClient.java */
import java.io.*;
import java.net.*;
public class UDPEchoClient {
public final static String serverIP = "localhost";
public final static int serverPort = 13;
public static String userName = null;
@SuppressWarnings("resource")
public static void main(String[] args) {
DatagramSocket client = null;
try {
/* 获取服务器地址 */
InetAddress server = InetAddress.getByName(serverIP);
/* 创建客户端DatagramSocket */
client = new DatagramSocket();
/* 从用户键盘读取输入 */
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
/* 登陆 */
System.out.print("Please Login: ");
userName = sin.readLine();
/* 获取用户输入的一行,exit则退出 */
String line;
System.out.print("> ");
line = sin.readLine();
while (!line.equals("exit")) {
line = "[" + userName + "]: " + line;
/* 从用户输入转化为byte */
byte[] data = line.getBytes("utf-8");
/* 将byte内容转化为UDP数据包 */
DatagramPacket sendPacket = new DatagramPacket(data, data.length, server, serverPort);
/* UPD发送数据包 */
client.send(sendPacket);
/* 定义接收byte空间 */
byte[] buffer = new byte[8192];
/* 将UDP数据包内容保存在byte中 */
DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
/* UDP接收数据包 */
client.receive(receivePacket);
/* 输出服务器返回的内容 */
System.out.println(new String(receivePacket.getData(), receivePacket.getOffset(),
receivePacket.getLength(), "utf-8"));
/* 读取用户下一行输入 */
System.out.print("> ");
line = sin.readLine();
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
/* 安全关闭Socket */
try {
if (client != null) {
client.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/* UDPEchoServer.java */
import java.io.*;
import java.net.*;
import java.util.Date;
public class UDPEchoServer {
public final static int serverPort = 13;
@SuppressWarnings({ "resource", "static-access", "unused" })
public static void main(String[] args) {
DatagramSocket server = null;
try {
/* 创建服务端DatagramSocket */
server = new DatagramSocket(serverPort);
System.out.println("Server start running...");
while (true) {
/* 定义接收byte空间 */
byte[] buffer = new byte[8192];
/* 将UDP数据包内容保存在byte中 */
DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
/* UDP接收数据包 */
server.receive(receivePacket);
/* 获取当前系统时间 */
Date currentTime = new Date();
/* 处理客户端的输入 */
String echo = new String(receivePacket.getData(), receivePacket.getOffset(),
receivePacket.getLength(), "utf-8");
echo = currentTime.toString().split(" ")[3] + " " + echo;
/* 打印系统日志记录用户输入 */
System.out.println(echo);
/* 从客户端输入转化为byte */
byte[] data = echo.getBytes("utf-8");
/* 将byte内容转化为UDP数据包 */
DatagramPacket sendPacket = new DatagramPacket(data, data.length,
receivePacket.getAddress(), receivePacket.getPort());
/* UPD发送数据包 */
server.send(sendPacket);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
/* 安全关闭Socket */
try {
if (server != null) {
server.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/* Makefile */
target:
javac -encoding utf-8 UDPEchoClient.java
javac -encoding utf-8 UDPEchoServer.java
run-UDPEchoClient:
java UDPEchoClient
run-UDPEchoServer:
java UDPEchoServer
clean:
rm *.class
运行截图
问题解决方案
- 中文编码问题:在代码使用UTF-8编码并且编译选项添加UTF8参数的话,不需要在代码中声明为UTF8编码,使用了反而会出错,亲测。
- 面向连接的传输TCP:由于需要面向连接,因此一个服务端需要和多个客户端进行通信,这就需要在服务端使用多线程技术,一个客户端分配一个线程,分别处理不同客户端的通信。
- 面向无连接的传输UDP:由于不需要连接,也不在意可靠传输,因此当客户端发送了一个数据包之后,若一定时间内没有返回内容,可以认为传输失败,让用户接着输入下一个内容。
- 关于TCP的聊天室:在客户端中无法体现出一个聊天室的完成功能,但是服务端是体现出来了,如果需要在客户端也有这个体现,需要做线程之间的通信,想想还是太麻烦我就没做了。
- 还有一点是面向连接的程序,不应该每发送一次就连接一次再断开连接,这样子的通信效率太低,而是应该等到客户端退出后再断开连接,这点已实现。
样例代码下载
传送门:下载
Java实现UDP之Echo客户端和服务端的更多相关文章
- Java实现TCP之Echo客户端和服务端
Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- 在Java中使用Socket模拟客户端和服务端(多线程)
1:Socket与ServerSocket的交互 2.Socket和ServerSocket介绍 Socket 构造函数 Socket() Socket(InetAddress address, in ...
- [Java]Hessian客户端和服务端代码例子
简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...
- java客户端与服务端交互通用处理 框架解析
一.综述 java 客户端与服务端交互过程中,采用NIO通讯是异步的,客户端基本采用同一处理范式,来进行同异步的调用处理. 处理模型有以下几个要素: 1. NIO发送消息后返回的Future 2. 每 ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- java网络编程客户端与服务端原理以及用URL解析HTTP协议
常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...
- java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并
实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request ...
- 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例
UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...
随机推荐
- 2016-03-24:Windows内存泄露分析工具
参考资料 100%正确的内存泄漏分析工具 ------ tMemMonitor (TMM)
- WWF3入门<第一篇>
工作流是什么东西?暂时还不是很弄得清除. 工作流是用来解决什么问题的?暂时只是形成了一个很模糊的概念,还没办法用语言描述出来. 一.入门范例 以VS2008为例,先来创建一个WWF程序. 在工具箱中, ...
- MVC组件分析(转)
2System.Web.Mvc V 4.0.0.0 组件分析 2.1 Routing组件(路由选择) Routing的作用就是负责分析Url Action的要求• 必须是一个公有方法• 必须返回Act ...
- JS常用的设计模式(10)——模版方法模式
模式方法是预先定义一组算法,先把算法的不变部分抽象到父类,再将另外一些可变的步骤延迟到子类去实现.听起来有点像工厂模式( 非前面说过的简单工厂模式 ). 最大的区别是,工厂模式的意图是根据子类的实现最 ...
- Muzei Live Wallpaper壁纸应用安卓源码项目
这个刚刚在安卓教程网那里看到的,这个是Muzei Live Wallpaper壁纸应用源码,这是已经在Playstore上线了的android壁纸应用,点击壁纸界面可以磨砂透明效果以及一般背景效果之间 ...
- kickstart简介 20140707
kickstart是红帽发行版中的一种安装方式,它通过以配置文件的方式来记录linux系统安装是的各项参数和想要安装的软件.只要配置正确, 整个安装过程中无需人工交互参与,达到无人值守安装的目的,因而 ...
- 设置Safari浏览器在标签栏上打开新窗口,而不是弹出一个新窗口
打开Safari浏览器的偏好设置,如图: 打开“标签”一项,如上图.在“在标签(而不是窗口)中打开页面:”中设置.
- 设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身
设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身. 方法: (1)界面操作,把DataGridView控件拖放在窗体中,就看到DataGridView控件的右上角有个小三角, ...
- postgresql 分区表
1.普通方式建立主表 create table tbl_partition( id integer, name ), gender boolean, join_date date, dept ) ) ...
- PHPCMS建站经验分享
在这里不对模型.模板设置.category,list,show等静态页面引入.配置文件(caches\configs\database.php 和 caches\configs\system.php) ...