【Java网络编程】基于 UDP 的聊天通信

使用 udp 协议,写一个基于命令行的聊天软件;客户端跟服务端分别在命令行启动之后,客户端和服务器端可以互相发送数据。

代码实现如下:

一、创建线程 sendThread 和 receiveThread

  1 package com.fhcq.chat;
  2 
  3 //双工的聊天程序
  4 //可以发送数据,同时也可以等待接收数据
  5 //需要使用多线程来实现
  6 
  7 public class QICQDemo {
  8 
  9     public static void main(String[] args) {
 10         // TODO Auto-generated method stub
 11 
 12         Send send = new Send();
 13         Receive receive = new Receive();
 14 
 15         Thread sendThread = new Thread(send);
 16         Thread receiveThread = new Thread(receive);
 17 
 18         sendThread.start();
 19         receiveThread.start();
 20     }
 21 }

 

二、利用线程 sendThread 实现信息的发送

  1 package com.fhcq.chat;
  2 
  3 import java.io.IOException;
  4 import java.net.DatagramPacket;
  5 import java.net.DatagramSocket;
  6 import java.net.InetAddress;
  7 import java.net.SocketException;
  8 import java.net.UnknownHostException;
  9 import java.util.Scanner;
 10 
 11 public class Send implements Runnable {
 12 
 13     @Override
 14     public void run() {
 15         // TODO Auto-generated method stub
 16 
 17         try {
 18             DatagramSocket datagramSocket = new DatagramSocket();
 19             InetAddress inetAddress = InetAddress.getByName("congkick");
 20             Scanner scanner = new Scanner(System.in);
 21             while(true){
 22                 // 阻塞
 23                 String nextLine = scanner.nextLine();
 24               byte[] bytes = nextLine.getBytes();
 25               DatagramPacket datagramPacket = new DatagramPacket
 26                      (bytes,bytes.length,inetAddress,10019);
 27                 datagramSocket.send(datagramPacket);
 28                 if (nextLine.equals("886")) {
 29                     break;
 30                 }
 31             }
 32         } catch (SocketException e) {
 33             // TODO Auto-generated catch block
 34             e.printStackTrace();
 35         } catch (UnknownHostException e) {
 36             // TODO Auto-generated catch block
 37             e.printStackTrace();
 38         } catch (IOException e) {
 39             // TODO Auto-generated catch block
 40             e.printStackTrace();
 41         }
 42     }
 43 }

 

三、利用线程 receiveThread 实现信息的接收

  1 package com.fhcq.chat;
  2 
  3 import java.io.IOException;
  4 import java.net.DatagramPacket;
  5 import java.net.DatagramSocket;
  6 import java.net.SocketException;
  7 
  8 public class Receive implements Runnable {
  9 
 10     @Override
 11     public void run() {
 12         // TODO Auto-generated method stub
 13 
 14         // 新建datagramSocket
 15         try {
 16             DatagramSocket datagramSocket = new DatagramSocket(10010);
 17             byte[] buf = new byte[1024];
 18             // 阻塞式方法
 19             DatagramPacket datagramPacket = new DatagramPacket(buf, 1024);
 20             while(true){
 21                 datagramSocket.receive(datagramPacket);
 22                 byte[] data = datagramPacket.getData();
 23                 int length = datagramPacket.getLength();
 24                 String string = new String(data,0,length);
 25                 System.out.println(string);
 26                 if (string.equals("886")) {
 27                     break;
 28                 }
 29             }
 30         } catch (SocketException e) {
 31             // TODO Auto-generated catch block
 32             e.printStackTrace();
 33         } catch (IOException e) {
 34             // TODO Auto-generated catch block
 35             e.printStackTrace();
 36         }
 37     }
 38 }
posted @ 2017-05-12 23:55  长情白月光  阅读(1289)  评论(2编辑  收藏  举报