1. 程式人生 > >網路程式設計UDP模仿QQ聊天功能

網路程式設計UDP模仿QQ聊天功能

2015年5月21日:

需要用到的類和包:

包:

import java.net.*;
import java.io.*;
類:
DatagramPacket
DatagramSocket
DatagramPacket 用來實現資料的傳送和接收

DatagramSocket 用來實現資料包傳送和接收的套接字

先上程式碼:

import java.io.*;
import java.net.*;
public class QQ
{
    public static void main(String[] args) throws Exception
    {
         Send send = new Send(new DatagramSocket());
         Rece rece = new Rece(new DatagramSocket(3000));

		 new Thread(send).start();
		 new Thread(rece).start();
    } 
}
class Send implements Runnable
{
	private DatagramSocket ds;
	public Send(DatagramSocket ds)
	{
		this.ds = ds;
	}
	public void run()
	{
		try
		{
			BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
			String str = null;
			while((str = bufr.readLine()) != null)
			{
				byte[] buf = str.getBytes();//把字串轉換成byte型別的陣列
				DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("172.18.177.255"), 3000);//打成資料包
				ds.send(dp);
				if ("886".equals(str))
					break;
			}
			ds.close();
		}
		catch (Exception e)
		{
			System.out.println("傳送端失敗");
		}
	}
}
class Rece implements Runnable
{
	private DatagramSocket ds;
	public Rece(DatagramSocket ds)
	{
		this.ds = ds;
	}
	public void run()
	{
		try
		{
			String str = null;
			while(true)
			{
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf, buf.length);
				ds.receive(dp);
				str = new String(dp.getData(), 0, dp.getLength());
				System.out.println(dp.getAddress().getHostAddress() + ":" + str);
			}
		}
		catch (Exception e)
		{
			System.out.println("接收端失敗");
		}
	}
}


因為既要實現傳送又要有接收, 那麼肯定是多執行緒了。

先來看傳送端:

1):繼承Runnable介面,傳入套接字引數 DatagramSocket ds

BufferedReader 是IO操作,實現從鍵盤上面輸入。

先來看第一步:

DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("1XX.18.1XX.255"), 3000);

buf表示包的資料 是byte[]型別的

所以要把字串轉換成byte[]型別 要呼叫getBytes()方法。

buf.length是包的長度

InetAddress,getByName("1XX.18.1XX.255");是你要傳送的目的的IP地址,255表示廣播,表示0-255的IP都會收到你傳送的資訊,相當於QQ群聊天。

3000表示埠

接著呼叫send方法傳送

接收端

2):同樣也是繼承Runnable介面,傳入套接字引數

byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
DatagramPacket dp = new DatagramPacket(buf, buf.length);

構造用來接收長度為length的資料包

然後呼叫receive方法來接收

接著String str = new String(dp.getData(), 0, dp.getLength());

這是用於輸出在控制檯螢幕上的  把資料輸出來

dp.getData() 獲取返回資料的緩衝區

dp.getLength()獲取將要傳送和接收的資料的長度

接著就在主函式裡面開始新建並啟動執行緒 開始執行

public static void main(String[] args) throws Exception
    {
         Send send = new Send(new DatagramSocket());
         Rece rece = new Rece(new DatagramSocket(3000));

		 new Thread(send).start();
		 new Thread(rece).start();
    } 

接著就可以開始和別人聊天啦!