Java实现一个简易聊天室流程

作者:宏远十一冠王 时间:2023-10-02 19:55:53 

说到网络,相信大家都对TCP、UDP和HTTP协议这些都不是很陌生,学习这部分应该先对端口、Ip地址这些基础知识有一定了解,后面我们都是直接上demo来解释代码

文件传输

Tcp方式

这里我们指的是C/S架构的文件传输,需要涉及一个客户端Client和服务器端(Server),这里采用的是TCP协议进行传输的,TCP需要经过三次握手和四次挥手,需要注意的是Client上传文件我们需要告诉服务器,我已经传输完成了socket.shutdownOutput()。

服务器

import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServerUpload {
   public static void main(String[] args) throws Exception {
       ServerSocket serverSocket = new ServerSocket(9999);
       Socket socket = serverSocket.accept();
       // 或去输入
       InputStream is = socket.getInputStream();
       FileOutputStream outputStream = new FileOutputStream(new File("receive.jpg"));
       byte[] buffer = new byte[1024];
       int len;
       while ((len = is.read(buffer)) != -1) {
           outputStream.write(buffer, 0, len);
       }
       OutputStream outputStream1 = socket.getOutputStream();
       outputStream1.write("我接收完毕了".getBytes());
       is.close();
       outputStream.close();
       serverSocket.close();
       serverSocket.close();
outputStream1.close();
   }
}

客户端

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TestClientUpload {
   public static void main(String[] args) throws Exception {
       Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
       // 创建输出流
       OutputStream outputStream = socket.getOutputStream();
       FileInputStream fileInputStream = new FileInputStream(new File("1.jpg"));
       byte[] buffer = new byte[1024];

int len;
       while (((len = fileInputStream.read(buffer))) != -1) {
           outputStream.write(buffer, 0, len);
       }
       // 通知服务器我已经结束了
       socket.shutdownOutput();
       InputStream inputStream = socket.getInputStream();
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       byte[] buffer2 = new byte[1024];
       int len2;
       while ((len2 = inputStream.read(buffer2)) != -1) {
           baos.write(buffer2, 0, len2);
       }
       System.out.println(baos.toString());
       socket.close();
       fileInputStream.close();
       outputStream.close();
       inputStream.close();
       baos.close();
   }
}

Udp 方式

UDP是一种只管发送,不需要确保你已经接收的通信协议,就比如短信,我只管发送给您,但是不管有没有接收到。

public class UdpClient {
   public static void main(String[] args) throws Exception {
       // 1. 建包
       DatagramSocket socket = null;
       try {
           socket = new DatagramSocket();
       } catch (SocketException e) {
           e.printStackTrace();
       }
       // 2. 建个包
       String msg = "早安呀,大勇";
       InetAddress localhost = InetAddress.getByName("localhost");
       int port = 9999;
       DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
       // 3. 发送包
       socket.send(datagramPacket);
       socket.close();
   }
}
public class UdpServer {
   public static void main(String[] args) throws Exception{
       // 开发端口
       DatagramSocket socket = new DatagramSocket(9999);
       // 收包
       byte[] buffer = new byte[1024];
       DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
       // 阻塞接收
       socket.receive(datagramPacket);
       System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));
       System.out.println(datagramPacket.getAddress().getHostAddress());
       socket.close();
   }
}

简易聊天室的实现

接收端

public class TalkReceive implements Runnable {
   DatagramSocket socket;
   private int port;
   private String msgFrom;
   public TalkReceive(int port, String msgFrom) {
       this.msgFrom = msgFrom;
       this.port = port;
       try {
           socket = new DatagramSocket(port);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
   @Override
   public void run() {
       while (true) {
           try {
               byte[] buffer = new byte[1024];
               DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
               socket.receive(datagramPacket);
               if (datagramPacket.getLength() > 0) {
                   byte[] data = datagramPacket.getData();
                   String receiveDatas = new String(data, 0, data.length);

System.out.println("接收到了"+ msgFrom + receiveDatas);
                   if ("bye".equals(receiveDatas)) {
                       break;
                   }
               }
           } catch (Exception ex) {
               ex.printStackTrace();
           }
       }
       socket.close();
   }
}

发送端

public class TalkSend implements Runnable {
   DatagramSocket socket = null;
   private int fromPort;
   private String toIp;
   private int toPort;
   BufferedReader reader = null;
   public TalkSend(int fromPort, String toIp, int port) {
       this.fromPort = fromPort;
       this.toIp = toIp;
       this.toPort = port;
       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, data.length(), new InetSocketAddress(this.toIp, toPort));
               socket.send(packet);
               if ("bye".equals(data)) {
                   break;
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
           // 数据
       }
       socket.close();
   }
}

启动

public class TalkStudent {
   public static void main(String[] args) {
       new Thread(new TalkSend(7777, "localhost", 9999)).start();
       new Thread(new TalkReceive(8888, "老师")).start();
   }
}
public class TalkTeacher {
   public static void main(String[] args) {
       new Thread(new TalkSend(5555, "localhost", 8888)).start();
       new Thread(new TalkReceive(9999, "学生")).start();
   }
}

来源:https://blog.csdn.net/zly03/article/details/127712315

标签:Java,聊天室
0
投稿

猜你喜欢

  • C++ 中的异常抛出和捕获方式

    2021-06-08 21:24:19
  • 深入理解Java设计模式之抽象工厂模式

    2023-11-28 12:11:34
  • Android编程中避免内存泄露的方法总结

    2023-07-27 19:32:50
  • 使用Sharding-JDBC对数据进行分片处理详解

    2021-07-27 23:46:04
  • 一文看懂C#中List的扩容机制

    2022-11-04 22:12:01
  • Java用 Rhino/Nashorn 代替第三方 JSON 转换库

    2023-11-04 02:20:26
  • c#调用qq邮箱smtp发送邮件修改版代码分享

    2023-04-03 11:11:31
  • 基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]

    2022-02-04 00:41:18
  • Android使用CountDownTimer模拟短信验证倒计时

    2022-10-24 18:00:28
  • 快速解决commons-fileupload组件无法处理自定义head信息的bug

    2023-03-05 15:20:14
  • springcloud feign传输List的坑及解决

    2023-06-20 18:31:57
  • Android开发登陆案例

    2022-03-19 10:13:01
  • 如何利用Spring MVC实现RESTful风格

    2021-06-06 02:02:13
  • C#使用NPOI将excel导入到list的方法

    2023-11-17 22:49:09
  • Android App中自定义View视图的实例教程

    2021-08-16 16:54:35
  • Kotlin协程与并发深入全面讲解

    2022-09-11 12:28:25
  • springboot 项目启动后无日志输出直接结束的解决

    2023-05-25 02:28:21
  • Javaweb El表达式实例详解

    2021-06-21 22:59:32
  • 解析C#彩色图像灰度化算法的实现代码详解

    2022-01-26 07:34:55
  • SpringBoot 如何使用RestTemplate发送Post请求

    2022-03-03 09:35:47
  • asp之家 软件编程 m.aspxhome.com