題目:
假設Tom和Jerry利用Java UDP進行聊天,請為他們撰寫程式,具體如下:
(1)、Tom和Jerry聊天的雙方都應該具有發送端和接收端;
(2)、利用DatagramSocket與DatagramPacket;
(3)、實作 java.lang.Runnable類,重寫 run()方法,

學過計網的都知道,利用三元組(ip地址,協議,埠)就可以標識網路的行程了,
而進行通信我們直接運用socket就可以了,首先需要知道是socket是什么,這部分可以參考這個大佬寫的博客,
https://blog.csdn.net/pashanhu6402/article/details/96428887
實作一個客戶端,那么需要Tom和Jerry都可以實作接收和發送功能,分別用兩個執行緒啟動,
接收執行緒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)
{
//接收資料包
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");
}
}
}
發送執行緒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{
//發送的socket端
private DatagramSocket sender = null;
//待發送的目標地址
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)
{
//輸入待發送的內容
String input = scan.nextLine();
if(input.equals("exit"))
break;
byte[] data = null;
data = input.getBytes("UTF-8");
//創建UDP資料報
DatagramPacket pack = new DatagramPacket(data, data.length,address);
sender.send(pack);
}
System.out.println("Exit!");
}catch(IOException e)
{
System.out.println("IOException");
}
}
}
聊天服務器
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;
//創建待接受資料包的目的機的埠號和IP地址
address = new InetSocketAddress(IP, DEST_PORT);
//創建發送的Socket端
DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
//創建接受的Socket端
DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
//發送執行緒建立
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;
//創建待接受資料包的目的機的埠號和IP地址
address = new InetSocketAddress(IP, DEST_PORT);
//創建發送的Socket端
DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
//創建接受的Socket端
DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
//發送執行緒建立
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!");
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231573.html
標籤:java
