欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java UDP實現(xiàn)一個聊天工具的示例代碼

 更新時間:2021年01月18日 09:39:36   作者:中二病沒有蛀牙  
這篇文章主要介紹了java UDP實現(xiàn)一個聊天工具的示例代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

題目:
假設(shè)Tom和Jerry利用Java UDP進行聊天,請為他們編寫程序。具體如下:
(1)、Tom和Jerry聊天的雙方都應(yīng)該具有發(fā)送端和接收端;
(2)、利用DatagramSocket與DatagramPacket;
(3)、實現(xiàn) java.lang.Runnable類,重寫 run()方法。

在這里插入圖片描述

學(xué)過計網(wǎng)的都知道,利用三元組(ip地址,協(xié)議,端口)就可以標識網(wǎng)絡(luò)的進程了。
而進行通信我們直接運用socket就可以了,首先需要知道是socket是什么,這部分可以參考這個大佬寫的博客。
http://www.dbjr.com.cn/article/121601.htm
實現(xiàn)一個客戶端,那么需要Tom和Jerry都可以實現(xiàn)接收和發(fā)送功能,分別用兩個線程啟動。

接收線程Receive_Thread.java

package Chat_UDP;

import java.io.IOException;
import java.util.Date;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.text.SimpleDateFormat;

public class Receive_Thread extends Thread {
 private static final int MAX_RECEIVE_BUFFER = 1024;
 private DatagramSocket server;
 private DatagramPacket packet;
 byte[] buffer = new byte[MAX_RECEIVE_BUFFER];
 
 public Receive_Thread(DatagramSocket server)
 {
  this.server = server;
  packet = new DatagramPacket(buffer, buffer.length);
 }
 
 @Override
 public void run() {
  try
  {
   while(true)
   {
    //接收數(shù)據(jù)包
    server.receive(packet);
    String s = new String(packet.getData(),packet.getOffset(),packet.getLength(),"UTF-8");
    Date day=new Date(); 
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    if(packet.getPort() == 10001)
    	System.out.println("Tom"+packet.getAddress()+" 說:"+s+"\t"+df.format(day));
    else{
    	System.out.println("Jerry"+packet.getAddress()+" 說 :"+s+"\t"+df.format(day));
    }
    packet.setLength(buffer.length);
   }
  }
  catch(IOException e)
  {
   System.out.println("IOException");
  }
 }
}

發(fā)送線程Send_Thread.java

package Chat_UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Scanner;

public class Send_Thread extends Thread{
 //發(fā)送的socket端
 private DatagramSocket sender = null;
 //待發(fā)送的目標地址
 private InetSocketAddress address = null;
 //從鍵盤輸入
 Scanner scan = new Scanner(System.in);
 public Send_Thread(DatagramSocket sender,InetSocketAddress address)
 {
  this.sender = sender;
  this.address = address;
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try
  {
   while(true)
   {
    //輸入待發(fā)送的內(nèi)容
    String input = scan.nextLine();
    if(input.equals("exit"))
     break;
    byte[] data = null;
    data = input.getBytes("UTF-8");
    //創(chuàng)建UDP數(shù)據(jù)報
    DatagramPacket pack = new DatagramPacket(data, data.length,address);
    sender.send(pack); 
   }
   System.out.println("Exit!");
   
  }catch(IOException e)
  {
   System.out.println("IOException");
  }
 }

}

聊天服務(wù)器
Chat_Server.java

package Chat_UDP;
//楊麗冰 201831064402
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Chat_Server {

 private static final int DEST_PORT = 8888;
 private static final int SEND_PORT = 10001;
 private static final int RECE_PORT = 9000;
 private static final String IP = "127.0.0.1";

 public static void main(String[] args)
 {
  try{
   Send_Thread send_thread = null;
   Receive_Thread rece_thread = null;
   InetSocketAddress address = null;
   //創(chuàng)建待接受數(shù)據(jù)包的目的機的端口號和IP地址
   address = new InetSocketAddress(IP, DEST_PORT);
   //創(chuàng)建發(fā)送的Socket端
   DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
   //創(chuàng)建接受的Socket端
   DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
   //發(fā)送線程建立
   send_thread = new Send_Thread(sendsocket, address);
   //接受線程的建立
   rece_thread = new Receive_Thread(recesocket);
   send_thread.start();
   rece_thread.start();
  }catch(Exception e)
  {
   System.out.println("Exception!");
  }

 }

}

聊天客戶端 Chat_Client.java

package Chat_UDP;
//楊麗冰 201831064402
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Chat_Client {
	//聲明端口號
 private static final int DEST_PORT = 9000;
 private static final int SEND_PORT = 10000;
 private static final int RECE_PORT = 8888;
 private static final String IP = "127.0.0.1";

 public static void main(String[] args)
 {
  try{
   Send_Thread send_thread = null;
   Receive_Thread rece_thread = null;
   InetSocketAddress address = null;
   //創(chuàng)建待接受數(shù)據(jù)包的目的機的端口號和IP地址
   address = new InetSocketAddress(IP, DEST_PORT);
   //創(chuàng)建發(fā)送的Socket端
   DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
   //創(chuàng)建接受的Socket端
   DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
   //發(fā)送線程建立
   send_thread = new Send_Thread(sendsocket, address);
   //接受線程的建立
   rece_thread = new Receive_Thread(recesocket);
   send_thread.start();
   rece_thread.start();

  }catch(Exception e)
  {
   System.out.println("Exception!");
  }

 }

}

需要注意的時候運行的時候需要同時運行聊天服務(wù)器和客戶端,才能夠正常運行。
最終效果如下:

在這里插入圖片描述
在這里插入圖片描述

到此這篇關(guān)于java UDP實現(xiàn)一個聊天工具的文章就介紹到這了,更多相關(guān)java UDP聊天工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring入門到精通之注解開發(fā)詳解

    Spring入門到精通之注解開發(fā)詳解

    Spring是輕代碼而重配置的框架,配置比較繁重,影響開發(fā)效率,所以注解開發(fā)是一種趨勢。本文將通過示例為大家詳細講講Spring如何實現(xiàn)注解開發(fā),感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • Java通過URL獲取公眾號文章生成HTML的方法

    Java通過URL獲取公眾號文章生成HTML的方法

    這篇文章主要介紹了Java通過URL獲取公眾號文章生成HTML的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解Java中布隆過濾器(Bloom Filter)原理及其使用場景

    詳解Java中布隆過濾器(Bloom Filter)原理及其使用場景

    布隆過濾器是1970年由布隆提出的,它實際上是一個很長的二進制向量和一系列隨機映射函數(shù),它的作用是檢索一個元素是否存在我們的集合之中,本文給大家詳細的講解一下布隆過濾器,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • 短網(wǎng)址的原理與生成方法(Java實現(xiàn))

    短網(wǎng)址的原理與生成方法(Java實現(xiàn))

    這篇文章主要給大家介紹了關(guān)于短網(wǎng)址的原理與生成方法,利用的是Java實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • spring boot mybatis多數(shù)據(jù)源解決方案過程解析

    spring boot mybatis多數(shù)據(jù)源解決方案過程解析

    這篇文章主要介紹了spring boot mybatis多數(shù)據(jù)源解決方案過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 如何使用CountDownLatch同步j(luò)ava多線程

    如何使用CountDownLatch同步j(luò)ava多線程

    這篇文章主要介紹了如何使用CountDownLatch同步j(luò)ava多線程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Java修飾符abstract與static及final的精華總結(jié)

    Java修飾符abstract與static及final的精華總結(jié)

    abstract、static、final三個修飾符是經(jīng)常會使用的,對他們的概念必須非常清楚,弄混了會產(chǎn)生些完全可以避免的錯誤,比如final和abstract不能一同出現(xiàn),static和abstract不能一同出現(xiàn),下面我們來詳細了解
    2022-04-04
  • Spring Boot 2.0多數(shù)據(jù)源配置方法實例詳解

    Spring Boot 2.0多數(shù)據(jù)源配置方法實例詳解

    這篇文章主要介紹了Spring Boot 2.0多數(shù)據(jù)源配置方法實例詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Java中的Object類用法總結(jié)

    Java中的Object類用法總結(jié)

    Java是一種面向?qū)ο蟮木幊陶Z言,它提供了一個非常強大的類庫,其中一個基本類是Object類,下面這篇文章主要給大家介紹了Java中Object類用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • Java的Netty進階之Future和Promise詳解

    Java的Netty進階之Future和Promise詳解

    這篇文章主要介紹了Java的Netty進階之Future和Promise詳解,Netty 是基于 Java NIO 的異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,使用 Netty 可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用,Netty 提供了高層次的抽象來簡化 TCP 和 UDP 服務(wù)器的編程,但是你仍然可以使用底層的 API,需要的朋友可以參考下
    2023-11-11

最新評論