Java简单实现UDP和TCP的示例

 更新时间:2017年11月07日 08:42:48   作者:cccc_hi  
下面小编就为大家带来一篇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的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 5分钟快速创建spring boot项目的完整步骤

    5分钟快速创建spring boot项目的完整步骤

    这篇文章主要给大家介绍了关于通过5分钟快速创建spring boot项目的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    这篇文章主要介绍了java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java多线程并发之线程池任务请求拦截测试实例

    Java多线程并发之线程池任务请求拦截测试实例

    这篇文章主要介绍了Java多线程并发之线程池任务请求拦截测试实例,队列中永远没有线程被加入,即使线程池已满,也不会导致被加入排队队列,实现了只有线程池存在空闲线程的时候才会接受新任务的需求,需要的朋友可以参考下
    2023-12-12
  • 浅谈Java线程间通信方式

    浅谈Java线程间通信方式

    这篇文章主要为大家详细介绍了Java线程间的通信方式,以代码结合文字的方式来讨论线程间的通信,感兴趣的朋友可以参考一下
    2021-11-11
  • RocketMQ中的NameServer详细解析

    RocketMQ中的NameServer详细解析

    这篇文章主要介绍了RocketMQ中的NameServer详细解析,NameServer是一个非常简单的Topic路由注册中心,支持Broker的动态注册与发现,因此不能保证NameServer的一致性,需要的朋友可以参考下
    2024-01-01
  • Java循环对bean的属性进行赋值的实现

    Java循环对bean的属性进行赋值的实现

    本文主要介绍了Java循环对bean的属性进行赋值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 详解在SpringBoot中@Transactional事物操作和事物无效问题排查

    详解在SpringBoot中@Transactional事物操作和事物无效问题排查

    这篇文章主要介绍了详解在SpringBoot中@Transactional事物操作和事物无效问题排查,本文详细的介绍了SpringBoot中集成使用@Transactional注解操作事物以及事物开启后无效的问题排查,需要的朋友可以参考下
    2021-06-06
  • java语言实现猜数字游戏

    java语言实现猜数字游戏

    这篇文章主要为大家详细介绍了java语言实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 搭建 springboot selenium 网页文件转图片环境的详细教程

    搭建 springboot selenium 网页文件转图片环境的详细教程

    这篇文章主要介绍了搭建 springboot selenium 网页文件转图片环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • shiro之记住登录信息

    shiro之记住登录信息

    Shiro提供了记住我(RememberMe)的功能,当关闭浏览器时下次再次打开还能记住你的信息,下面小编给大家分享shiro之记住登录信息的相关知识,感兴趣的朋友一起看看吧
    2017-09-09

最新评论