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协议: 四层:应用层.传输层.网络层和链路层: ...
随机推荐
- .Net Core2.0 + Nginx + CentOS 部署
准备把项目往Linux上迁移,整个流程跑了一下,也遇到无数个坑...以下为亲测并修改后的完整流程... 安装ZIP yum install -y unzip zip Putty:WINDOWS上传文件 ...
- 11 Linear Models for Classification
一.二元分类的线性模型 线性分类.线性回归.逻辑回归 可视化这三个线性模型的代价函数 SQR.SCE的值都是大于等于0/1的 理论分析上界 将回归应用于分类 线性回归后的参数值常用于pla/pa/lo ...
- VS2015 + EF6连接MYSQL
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,不仅支持SQL Server,还支持MySQL.Ora ...
- Win7 32位系统下Sublime text 3的安装以及配置C/C++、java、python的开发环境方法
本人初学者,此文仅是对这几天鼓捣subime text 3一点微不足道的经验总结,如有明显错误,欢迎指正! 好了,废话少说,进入正题,之前编程java一直用的是eclipse,java的主流IDE,后 ...
- UWP brush
---some words---- 1.Alpha:透明度 2.Argb :Alpha red green blue 3.brush: [brʌʃ] 刷子,笔画,笔刷 4.fore 前头 5.F ...
- jQuery插件:Ajax将Json数据自动绑定到Form表单
jQuery注册方法的两种常用方式: //jQuery静态方法注册 //调用方法$.a1() $.extend({ a1: function () { console.log("a1&quo ...
- zoj1109 水题(大神绕道) Language of FatMouse
Language of FatMouse Time Limit: 10 Seconds Memory Limit:32768 KB We all know that FatMouse doe ...
- 简单的CSS颜色查看工具
可以通过输入ARGB(A代表透明度)格式或者HEX格式查看颜色,也可以进行ARGB格式和者HEX格式转换,如下图 使用C#编写,我已将源代码压缩上传 下载地址:http://files.cnblogs ...
- DevOps之平台架构
唠叨话 关于德语噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. DevOps平台架构(Platform Architecture) <虚拟化平台(Platfor ...
- Oracle_11gR2_概念_第06章_数据字典和动态性能视图_英文词汇
decode 解码 be intend for 适应 distinguished 显著的,突出的 implied 隐含的 abbreviated 简短的 enabled roles 已 ...