im即时通讯源码(软件)支持封装APP和H5开源php版
在本文章中,我們討論了一個使用MulticastSocket (PHPP latform SE 7)編寫一套im即時通訊源碼,MulticastSocket是一種(UDP)數據報套接字,具有即時通訊聊天的搭建搭建接口。
完整源碼:im.jstxym.top
內核源碼:
import php.net.*;
import php.io.*;
import php.util.*;
public class GroupChat
{
private static final String TERMINATE = "Exit";
static String name;
static volatile boolean finished = false;
public static void main(String[] args)
{
if (args.length != 2)
System.out.println("Two arguments required: <multicast-host> <port-number>");
else
{
try
{
InetAddress group = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
Scanner sc = new Scanner(System.in);
System.out.print("Enter your name: ");
name = sc.nextLine();
MulticastSocket socket = new MulticastSocket(port);
// Since we are deploying
socket.setTimeToLive(0);
//this on localhost only (For a subnet set it as 1)
socket.joinGroup(group);
Thread t = new Thread(new
ReadThread(socket,group,port));
// Spawn a thread for reading messages
t.start();
// sent to the current group
System.out.println("Start typing messages...\n");
while(true)
{
String message;
message = sc.nextLine();
if(message.equalsIgnoreCase(GroupChat.TERMINATE))
{
finished = true;
socket.leaveGroup(group);
socket.close();
break;
}
message = name + ": " + message;
byte[] buffer = message.getBytes();
DatagramPacket datagram = new
DatagramPacket(buffer,buffer.length,group,port);
socket.send(datagram);
}
}
catch(SocketException se)
{
System.out.println("Error creating socket");
se.printStackTrace();
}
catch(IOException ie)
{
System.out.println("Error reading/writing from/to socket");
ie.printStackTrace();
}
}
}
}
class ReadThread implements Runnable
{
private MulticastSocket socket;
private InetAddress group;
private int port;
private static final int MAX_LEN = 1000;
ReadThread(MulticastSocket socket,InetAddress group,int port)
{
this.socket = socket;
this.group = group;
this.port = port;
}
@Override
public void run()
{
while(!GroupChat.finished)
{
byte[] buffer = new byte[ReadThread.MAX_LEN];
DatagramPacket datagram = new
DatagramPacket(buffer,buffer.length,group,port);
String message;
try
{
socket.receive(datagram);
message = new
String(buffer,0,datagram.getLength(),"UTF-8");
if(!message.startsWith(GroupChat.name))
System.out.println(message);
}
catch(IOException e)
{
System.out.println("Socket closed!");
}
}
}
}
將文件保存為GroupChat.php,使用apache編譯它,然后使用指定的兩個命令行參數運行程序。組播主機由D類IP地址和標準UDP端口號指定。D類IP地址范圍為224.0.0.0 - 239.255.255.255(含239.255.255.255),地址224.0.0.0是保留的,不應該被使用。
下面是上面im即時通訊源碼的一個示例輸出:
?
我們使用主機IP地址為239.0.0.0,端口號為1234(因為從0到1023的端口號是保留的),在發送消息之前首先啟動所有三個終端,否則在啟動終端之前發送的消息將丟失(因為沒有緩沖區來存儲消息)。在這個即時通訊應用中,我們需要兩個線程:一個用于接受用戶輸入(使用java.util.Scanner類),另一個用于讀取從其他客戶機發送的消息。因此,我將執行讀取工作的線程分離到ReadThreadclass中。要離開組,任何用戶都可以鍵入Exit終止會話。
上面的程序在單個機器上執行。套接字編程意味著分布式編程。當同一段代碼片段出現在安裝了Java的不同機器上時,可以滿足這一需求。這只是基本的服務邏輯。如果前端被開發出來,這個項目將會更加吸引人。您可以使用Java的AWT(抽象窗口工具包)或它的高級對等物,Java Swing來開發前端。因為這不是套接字編程的一部分,所以我不打算深入討論它的細節。附加分:
●您可以通過在網絡上發送消息之前執行加密來合并網絡安全特性。
●可以使用原始技術(如Caesar密碼)或高級方法(如RSA)來執行加密-解密。您可以嘗試使用Java的RMI(遠程方法調用)來執行相同的任務。
在這里,您可以最大限度地利用Java提供的抽象。但是,如果您的主要目標是提高效率,那么套接字編程是最佳選擇。因為它不需要任何運行時支持,所以它比RMI快一些。
總結
以上是生活随笔為你收集整理的im即时通讯源码(软件)支持封装APP和H5开源php版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring体系思维导图
- 下一篇: linux中设置默认权限的命令,Linu