Java UDP使用Socket进行网络聊天(2)之群聊版

作者 : 卿笃军

原文地址:http://blog.csdn.net/qingdujun/article/details/39312241

本文演示,使用Socket进行网络聊天之群聊,实现客户端给"局域网"网段里面的所以机器发送广播,当发送“886”的时候,表示客户端关闭。

1)客户端,给服务器发送数据,发送“886”表示关闭客户端。

2)服务器,一直监听9527端口,将监听到的数据打印在控制台上。

3)客户端+服务器版本,实现既可以发送数据,又可以接受数据的多线程聊天程序。

需要注意的几点是:1)这里是给局域网发送广播。  2)局域网广播地址:192.168.1.255  3)如果弹出Exception in thread "main" java.net.BindException: Address already in use: Cannot bind 问题,请换一个端口号(该端口号还没有被释放)。

一、客户端:主要使用了从键盘录入,和当发送“886”数据包的时候,关闭客户端。

[java] view plaincopyprint?

  1. package udp.send2.qdj;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.InetAddress;
  7. public class CUdpSend2 {
  8. public static void main(String[] args) throws Exception {
  9. //从本机1234端口发送数据
  10. DatagramSocket ds = new DatagramSocket(1234);
  11. //从键盘录入
  12. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  13. String line = null;
  14. while ((line=bufr.readLine())!=null)
  15. {
  16. if ("886".equals(line))
  17. break;
  18. byte[] buf = line.getBytes();
  19. //将数据打包,发送到对法机器的9527端口
  20. DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.254"),9527);
  21. //发送数据
  22. ds.send(dp);
  23. }
  24. //关闭资源
  25. ds.close();
  26. }
  27. }

二、服务器端,主要是一直监听9527端口,并将监听到的数据打印到控制台上。

1)控制台可以拖放出来,如果需要放进去点击"最小化"左边那个的最下面那个选项就可以。

2)切换控制台,可以点击"最小化"左边第2个选项。

[java] view plaincopyprint?

  1. package udp.rece2.qdj;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. public class CUdpRece2 {
  5. public static void main(String[] args) throws Exception{
  6. //监听9527端口
  7. DatagramSocket ds = new DatagramSocket(9527);
  8. while (true)
  9. {
  10. byte[] buf = new byte[1024];
  11. //定义一个数据包
  12. DatagramPacket dp = new DatagramPacket(buf, buf.length);
  13. //接受数据包
  14. ds.receive(dp);
  15. //提取数据
  16. String ip = dp.getAddress().getHostAddress();
  17. String data = new String(dp.getData(),0,dp.getLength());
  18. System.out.println("ip号:"+ip+"\n数据data:"+data);
  19. }
  20. }
  21. }

三、综合上述,编写一个既可以接受又可以发送的多线程群聊程序:

[java] view plaincopyprint?

  1. package udp.chat.qdj;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.InetAddress;
  7. //发送端
  8. class Send implements Runnable
  9. {
  10. private DatagramSocket ds;
  11. public Send(DatagramSocket s)
  12. {
  13. ds = s;
  14. }
  15. public void run() {
  16. try {
  17. //从键盘录入
  18. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  19. String line = null;
  20. while ((line=bufr.readLine())!=null)
  21. {
  22. if ("886".equals(line))
  23. break;
  24. byte[] buf = line.getBytes();
  25. //将数据打包,发送到对法机器的5656端口   //局域网广播地址:192.168.1.255
  26. DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("10.100.56.210"),5656);
  27. //发送数据
  28. ds.send(dp);
  29. }
  30. } catch (Exception e) {
  31. throw new RuntimeException("发送端失败");
  32. }
  33. }
  34. }
  35. //接收端
  36. class Rece implements Runnable
  37. {
  38. private DatagramSocket ds;
  39. public Rece(DatagramSocket s)
  40. {
  41. ds = s;
  42. }
  43. public void run() {
  44. try {
  45. while (true)
  46. {
  47. byte[] buf = new byte[1024];
  48. //定义一个数据包
  49. DatagramPacket dp = new DatagramPacket(buf, buf.length);
  50. //接受数据包
  51. ds.receive(dp);
  52. //提取数据
  53. String ip = dp.getAddress().getHostAddress();
  54. String data = new String(dp.getData(),0,dp.getLength());
  55. System.out.println(ip+":"+data);
  56. }
  57. } catch (Exception e) {
  58. throw new RuntimeException("接受端失败");
  59. }
  60. }
  61. }
  62. public class CUdpChat {
  63. public static void main(String[] args) throws Exception{
  64. //发送端可以不指定端口,系统随机分配一个
  65. DatagramSocket sendSocket = new DatagramSocket();
  66. DatagramSocket receSocket = new DatagramSocket(5656);
  67. //开启多线程
  68. new Thread(new Send(sendSocket)).start();
  69. new Thread(new Rece(receSocket)).start();
  70. }
  71. }

显示界面:

参考文献: Java视频 毕向东 主讲

原文地址:http://blog.csdn.net/qingdujun/article/details/39312241

时间: 2024-12-07 06:49:06

Java UDP使用Socket进行网络聊天(2)之群聊版的相关文章

Java UDP使用Socket进行网络聊天(1)

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39312065 本文演示,使用Socket进行网络聊天,实现客户端给服务器端一直发送消息,当发送“886”的时候,表示客户端关闭. 1)客户端,给服务器发送数据,发送“886”表示关闭客户端. 2)服务器,一直监听9527端口,将监听到的数据打印在控制台上. 一.客户端:主要使用了从键盘录入,和当发送“886”数据包的时候,关闭客户端. [java] view plainc

Java 使用Socket进行网络聊天(1)

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39312065 本文演示,使用Socket进行网络聊天,实现客户端给服务器端一直发送消息,当发送"886"的时候,表示客户端关闭. 1)客户端,给服务器发送数据,发送"886"表示关闭客户端. 2)服务器,一直监听9527端口,将监听到的数据打印在控制台上. 一.客户端:主要使用了从键盘录入,和当发送"886"数据包的时候,

Java 使用Socket进行网络聊天(2)之群聊版

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39312241 本文演示,使用Socket进行网络聊天之群聊,实现客户端给"局域网"网段里面的所以机器发送广播,当发送"886"的时候,表示客户端关闭. 1)客户端,给服务器发送数据,发送"886"表示关闭客户端. 2)服务器,一直监听9527端口,将监听到的数据打印在控制台上. 3)客户端+服务器版本,实现既可以发送数据,

基于Java实现hello/hi简单网络聊天程序

目录 Socket简要阐述 Socket的概念 Socket原理 hello/hi的简单网络聊天程序实现 服务器端 客户端 程序执行结果 跟踪分析调用栈 & Linux API对比 创建ServerSocket 调用栈图示 源码分析 Socket绑定 调用栈图示 源码分析 Socket监听 调用栈图示 源码分析 Socket Accept 调用栈图示 源码分析 Java Socekt API与Linux Socket API 参考链接 Socket简要阐述 Socket的概念 Socket的英文

Java TCP使用Socket进行网络文件传送(5)

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39324737 本文演示,TCP使用Socket进行网络文件传送,实现将客户端的文件upload.txt上传到服务器. 1)客户端,上传文件upload.txt,并接受服务器反馈上传成功与否消息. 2)服务器,接受客户端文件,将接收到的文件命名为Rece.txt,同时给客户端发送消息"上传成功". 客户端,代码如下: package upload.file.cli

Socket通信 简单实现私聊、群聊(dos命令下)

很久以前的一个Demo,这里服务器只做转发功能,根据ID地址和端口号来标识身份,群聊和私聊只是简单实现, 服务器代码如下: import java.util.*; import java.io.*; import java.net.*; public class Server extends Thread { private static Vector<Socket> vecClient = new Vector<Socket>(); private PrintWriter out

Java UDP使用Socket进行网络通信(0)

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39300293 下面演示一个程序,用客户端给服务器发送一条信息,服务器收到后,打印在控制面板上. 1)客户端,给服务器发送数据 2)服务器,收到数据后,打印在控制面板上 一.客户端,主要步骤: 1)创建udp服务.通过DatagramSocket对象. 2)创建数据,并封装成数据包. 3)通过Socket服务,将已有数据包发送出去.通过send方式. 4)关闭资源. 客户端

Java实现一个简单的网络聊天程序

一.TCP通信概述 TCP协议是面向连接的通信协议,在传输数据之前,发送端和接收端必须建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输. 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过三次握手. 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠. ·第一次握手,客户端向服务器端发出连接请求,等待服务器确认. ·第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求.

Golang的聊天服务器实践(群聊,广播)(一)

其实从上学开始就一直想写一个im. 最近深入go,真是学会了太多,感觉人森虽然苦短,但是也不能只用python.很多知识是不用编译型语言无法了解的. 该来的还是会来,现在会一步一步用go把这个服务器完善起来 先从这个demo开始. 这个demo 我们要求所有连上服务器的用户都会知道有用户的离开,有用户的加入(除了第一个加入的用户),每个人说话就像聊天室一样,房间里的所有人都能看到. 由于接收tcp请求,get accept的conn步骤都差不多所以先上main部分的代码: func main()