Java简单实现UDP和TCP
TCP实现
TCP协议需要在双方之间建立连接,通过输入输出流来进行数据的交换,建立需要通过三次握手,断开需要四次挥手,保证了数据的完整性,但传输效率也会相应的降低。

简单的TCP实现
//服务端
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8886); // 建立服务端,ip为本机ip,端口为8886
Socket accept = serverSocket.accept(); // 监听客户端的连接,一旦有客户端连接,则会返回客户端对应的accept
InputStream in = accept.getInputStream(); //获取到客户端的输出流
byte b[] = new byte[1024];
int len = in.read(b);
System.out.println("接受到客户端数据,返回数据"+new String(b,0,len));
OutputStream out = accept.getOutputStream(); // 给客户端发送消息
out.write("服务端已经接受".getBytes());
serverSocket.close();
}
}
// 客户端
public class TcpClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8886); // 通过Socket来建立和服务端的连接
OutputStream out = socket.getOutputStream(); // 获取输出流(客户端输出流即向服务端输出信息)
out.write("hello tcp Server".getBytes()); // 输出信息
InputStream in = socket.getInputStream(); // 接受服务端的消息
byte b[] = new byte[1024];
int len = in.read(b);
System.out.println("接受到服务器消息 : "+new String(b,0,len)); // 输出
out.write("返回的的数据已经收到 ".getBytes()); // 向服务器返回消息
socket.close();
}
}
改进服务端,启用多线程来接受客户端的数据
// server
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8886); // 建立服务端,ip为本机ip,端口为8886
int i=4;
while(i>2){
Socket accept = serverSocket.accept(); // 监听客户端的连接,一旦有客户端连接,则会返回客户端对应的accept
ServerThread st = new ServerThread(accept); // 启动线程
Thread th = new Thread(st);
th.start();
}
serverSocket.close();
}
// thread
public class ServerThread implements Runnable {
private Socket accept;
public ServerThread(Socket s) {
this.accept = s;
}
public void run(){
InputStream in;
try {
in = accept.getInputStream();
byte b[] = new byte[1024];
int len = in.read(b);
System.out.println("接受到客户端数据,返回数据" + new String(b, 0, len));
OutputStream out = accept.getOutputStream(); // 给客户端发送消息
out.write("服务端已经接受".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
传递图片
// 服务端
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(5555);
Socket ss = serverSocket.accept();
BufferedInputStream br = new BufferedInputStream(ss.getInputStream());
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("copy.jpg")); // 写出文件流
byte b[] = new byte[1024];
int len = 0;
while ((len = br.read(b)) != -1) { // 写出文件
bw.write(b, 0, len);
bw.flush(); // 别忘了刷新,要不然最后一块缓冲区字符串会缺失
}
BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream())); // 输出
bw2.write("图片传输成功");
bw2.flush();
bw.close();
ss.close();
}
}
// 客户端
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 5555);
BufferedInputStream in = new BufferedInputStream(new FileInputStream("c.jpg"));
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
byte b[] = new byte[1024];
int len = 0;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
out.flush(); // 刷新缓冲区 要不然最后一块缓冲区字符串会缺失
}
socket.shutdownOutput(); // 关闭流以后Server段才会接收道结束字符结束接受
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
in.close();
socket.close();
}
}
UDP实现
UDP是将数据打成数据包向对方发送,只关系是否发送成功,而不关心是否接收成功,传输速度快,但是可靠性低。
udp代码实现
// 发送端
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(); // 此类表示用来发送和接收数据报包的套接字。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 键盘输入
String line = null;
while ((line = br.readLine()) != null) {
byte[] bytes = line.getBytes();
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10005); // 数据包对象
ds.send(dp);
if ("886".equals(line)) { // 当输入886时结束发送
break;
}
}
ds.close();
}
}
// 接收端
public class ReciveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10005); // 建立服务端
byte bytes[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 建立数据包对象
while (true) {
ds.receive(dp); // 接受数据包
byte[] data = dp.getData(); // 获取数据
String str = new String(data, 0, dp.getLength());
if ("886".equals(str)) {
break;
}
System.out.println(str);
}
ds.close();
}
}
Java简单实现UDP和TCP的更多相关文章
- Java基础之UDP协议和TCP协议简介及简单案例的实现
写在前面的废话:马上要找工作了,做了一年的.net ,到要找工作了发现没几个大公司招聘.net工程师,真是坑爹呀.哎,java就java吧,咱从头开始学呗,啥也不说了,玩命撸吧,我真可怜啊. 摘要: ...
- 聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo
最近真的比较忙,很久就想写了,可是一直苦于写点什么,今天脑袋灵光一闪,觉得自己再UDP方面还有些不了解的地方,所以要给自己扫盲. 好了,咱们进入今天的主题,先列一下提纲: 1. UDP是什么,UDP适 ...
- JAVA基础学习day24--Socket基础一UDP与TCP的基本使用
一.网络模型 1.1.OIS参考模型 1.2.TCP/IP参考模型 1.3.网络通讯要素 IP地址:IPV4/IPV6 端口号:0-65535,一般0-1024,都被系统占用,mysql:3306,o ...
- Java网络通信协议、UDP、TCP类加载整理
网络通信协议 网络通信协议 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控制协议/英特网互 ...
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- Java之网络编程UDP和TCP
注*部分转来的 第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网 ...
- java基础(31):网络通信协议、UDP、TCP
1. 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通 ...
- Java第三阶段学习(八:网络通信协议、UDP与TCP协议)
一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...
- JAVA基础之网络通信协议--TCP与UDP
个人理解: 了解区分UDP与TCP的不同,正常情况都是两者结合的使用模式!为了更好的传输,经常会开多线程进行传输的! 一.网络通信协议: 1.TCP/IP协议: 四层:应用层.传输层.网络层和链路层: ...
随机推荐
- dynamics 365 AI 解决方案 —— 微软布局
核心提示:微软在 Office365.Azure 云.Dynamics365 上进行人工智能技术的部署,野心不小. 微软在2016年9月宣布组建自己的 AI 研究小组.该小组汇集了超过 5000 名计 ...
- JS设计模式(三) 数据访问对象模式
引言 HTML5 提供了两种在客户端存储数据的新方法:localStorage.sessionStorage,他们是Web Storage API 提供的两种存储机制,区别在于前者属于永久性存储,而后 ...
- JavaWeb(一)Servlet中的ServletConfig与ServletContext
前言 前面我介绍了一下什么是servlet,它的生命周期,执行过程和它的原理.这里我们做一个简单的回顾! 什么是Servlet? servlet 是运行在 Web 服务器中的小型 Java 程序(即: ...
- 最常用前端框架BootStrap——栅格系统
前 言 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义类,还有强大的mix ...
- 电脑本机ping通Linux虚拟机的方法
一.安装VMware: 二.创建Linux虚拟机(centOS7): 三.开启虚拟机,在Linux桌面右键打开终端,输入查看虚拟机ip地址的命令:ifconfig -a 四.打开本机cmd窗口, ...
- 【转】 中兴OLT-C300常用命令
中兴OLT C300show running-config (加载各种板卡)show gpon onu uncfg (查看OLT所有未配置的ONU)show gpon onu uncfg gpon-o ...
- SAP 条形码
使用系统生成的条形码 正常的排列;将扫描由左到右.旋转对齐将从上到下扫描90度倒立定线将扫描所180度从右到左底部对齐将从底部到顶部270度扫描 但在实际应用中,条形码的大小不仅与此处有关,也与字符格 ...
- Springmvc+Spring+Mybatis实现员工登录注册功能
ssm实现用户注册以及登录功能..转载请标明出处 http://www.cnblogs.com/smfx1314/p/smfx1314.html 前端bootstrap 所使用的IDE是eclips ...
- 使用Gradle构建Android项目
阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ...
- #tensorflow入门(1)
tensorflow入门(1) 关于 TensorFlow TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操 ...