假設(shè)有兩臺分別處于各自的私有網(wǎng)絡(luò)中的主機:A和B;N1和N2是兩個NAT設(shè)備;S是一個使用了一個眾所周知的、從全球任何地方都能訪問得搏拍含到的IP地址的公共服基笑務(wù)器
10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計制作后付款的網(wǎng)站建設(shè)流程,更有昆玉免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
步驟一:A和B分別和S建立UDP連賀纖接;NAT設(shè)備N1和N2創(chuàng)建UDP轉(zhuǎn)換狀態(tài)并分配臨時的外部端口號
步驟二:S將這些端口號傳回A和B
步驟三:A和B通過轉(zhuǎn)換好的端口直接聯(lián)系到對方的NAT設(shè)備;NAT設(shè)備則利用先前創(chuàng)建的轉(zhuǎn)換狀態(tài)將分組發(fā)往A和B
源碼已發(fā)送請查收
JAVA賀新態(tài)知年-自己動手做QQ(P2P聊天工具含源碼) - Dreamcode ~ ...
區(qū)襲閉答塊拍慧鏈中的消息傳播離不p2p通信 java實現(xiàn)一個簡單的p2p通信demo工具: idea jdk1.8 maven1 : idea新建maven項...
在JAVA中,發(fā)送和接收多播信息的方法:?
發(fā)送多播信息需經(jīng)歷步驟?
確定發(fā)送的具體信息內(nèi)容?
String msg = "Hello";?
選用專門為多播指定的D類IP地址(224.0.0.1到239.255.255.255),創(chuàng)建一個多播組?
InetAddress group = InetAddress.getByName("228.5.6.7");?
使用指定的端口(一般選1024以上的端口號)建立多播套接字?
MulticastSocket s = new MulticastSocket(6789);?
加入多播組?
s.joinGroup(group);?
創(chuàng)建一個數(shù)據(jù)報封裝多播信息?
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),?
group, 6789);?
發(fā)送?
s.send(hi);?
接收多播信息的步驟?
開辟接收緩沖區(qū)?
byte[] buf = new byte[1000];?
創(chuàng)建接收數(shù)據(jù)報?
DatagramPacket recv = new DatagramPacket(buf, buf.length);?
接收?
s.receive(recv);?
注意:以上發(fā)送和接收程序在同一個文件中實現(xiàn),若在不同文件中實現(xiàn)則應(yīng)分別定義多播套接字并加入多播組。?
3.與已知IP和端口的端點通信?
在互聯(lián)網(wǎng)上主要采用TCP和UDP來實現(xiàn)兩點之間的通信。采用TCP可可靠傳送信息,但花費時間較多;采用UDP可快速傳遞信息,但不能保證可靠傳遞。
JAVA實現(xiàn)TCP通信的方法 :
利用Socket(InetAddress addr, int port)和 Socket(String host, int port),創(chuàng)建客戶端套接字,利用ServerSocket(int port)創(chuàng)建服務(wù)器端套接字,port端口就是服務(wù)器監(jiān)聽連接請求的端口,通過調(diào)用accept()返回一個最近創(chuàng)建的Socket對象,該Socket對象綁定了客戶程序的IP地址或端口號。通過調(diào)用Socket的 getInputStream()方法獲得輸入流讀傳送輪伍來的信息,也可能通過調(diào)用Socket的 getOutputStream()方法獲得輸出流來發(fā)送消息。?
JAVA實現(xiàn)UDP通信的方法 :
使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port) 確定數(shù)據(jù)包數(shù)組、數(shù)組的長度、臘扒或數(shù)據(jù)包的地址和端口信息。使用DatagramSocket()創(chuàng)建客戶端套接字,而服務(wù)器端則采用DatagramSocket(int port),調(diào)用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)來發(fā)送和接收數(shù)據(jù)包。本文設(shè)計的程序采用UDP。
P2P(Peer-to-Peer 端到端)模型是與C/S(客戶/服務(wù)器)模型相對應(yīng)。基于C/S的用戶間通信需要由服務(wù)器中轉(zhuǎn),在C/S中的服務(wù)器故障將導(dǎo)致整個網(wǎng)絡(luò)通信的癱瘓此卜。。而基于P2P的用戶間通信則是直接通信,去掉了服務(wù)器這一層,帶來的顯著優(yōu)點是通信時沒有單一的失敗點,一個用戶的故障不會影響整個P2P網(wǎng)絡(luò)。本文提供了一種用JAVA實現(xiàn)P2P網(wǎng)絡(luò)通信的方法。 ?
程序分Server和Client
服務(wù)器端打開偵聽的端口,一有客戶端連衡昌接就創(chuàng)建兩個新的線程來負(fù)責(zé)這個連接
一個負(fù)責(zé)客戶端發(fā)送的信息(ClientMsgCollectThread 類),
另一個負(fù)責(zé)老攔薯通過該Socket發(fā)送數(shù)據(jù)(ServerMsgSendThread )
Server.java代碼如下:
/*
* 創(chuàng)建日期 2009-3-7
*
* TODO 要更改此生成的文件的模板,請轉(zhuǎn)至
* 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/
package faue.MutiUser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java點虐 .ServerSocket;
import java點虐 .Socket;
/**
* 服務(wù)器端
*
* @author Faue
*/
public class Server extends ServerSocket {
private static final int SERVER_PORT = 10000;
/**
* 構(gòu)造方法,用于實現(xiàn)連接的監(jiān)聽
*
* @throws IOException
*/
public Server() throws IOException {
super(SERVER_PORT);
try {
while (true) {
Socket socket = super.accept();
new Thread(new ClientMsgCollectThread(socket), "getAndShow"
+ socket.getPort()).start();
new Thread(new ServerMsgSendThread(socket), "send"
+ socket.getPort()).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new Server();
}
/**
* 該類用于創(chuàng)建接收客戶端發(fā)來的信息并顯示的線侍者程
*
* @author Faue
* @version 1.0.0
*/
class ClientMsgCollectThread implements Runnable {
private Socket client;
private BufferedReader in;
private StringBuffer inputStringBuffer = new StringBuffer("Hello");
/**
* 得到Socket的輸入流
*
* @param s
* @throws IOException
*/
public ClientMsgCollectThread(Socket s) throws IOException {
client = s;
in = new BufferedReader(new InputStreamReader(client
.getInputStream(), "GBK"));
}
public void run() {
try {
while (!client.isClosed()) {
inputStringBuffer.delete(0, inputStringBuffer.length());
inputStringBuffer.append(in.readLine());
System.out.println(getMsg(inputStringBuffer.toString()));
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");
}
}
/**
* 構(gòu)造顯示的字符串
*
* @param line
* @return
*/
private String getMsg(String line) {
return client.toString() + " says:" + line;
}
}
/**
* 該類用于創(chuàng)建發(fā)送數(shù)據(jù)的線程
*
* @author Faue
* @version 1.0.0
*/
class ServerMsgSendThread implements Runnable {
private Socket client;
private PrintWriter out;
private BufferedReader keyboardInput;
private StringBuffer outputStringBuffer = new StringBuffer("Hello");
/**
* 得到鍵盤的輸入流
*
* @param s
* @throws IOException
*/
public ServerMsgSendThread(Socket s) throws IOException {
client = s;
out = new PrintWriter(client.getOutputStream(), true);
keyboardInput = new BufferedReader(new InputStreamReader(System.in));
}
public void run() {
try {
while (!client.isClosed()) {
outputStringBuffer.delete(0, outputStringBuffer.length());
outputStringBuffer.append(keyboardInput.readLine());
out.println(outputStringBuffer.toString());
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");
}
}
}
}
客戶端:
實現(xiàn)基于IP地址的連接,連接后也創(chuàng)建兩個線程來實現(xiàn)信息的發(fā)送和接收
/*
* 創(chuàng)建日期 2009-3-7
*
*/
package faue.MutiUser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java點虐 .Socket;
/**
* 客戶端
*
* @author Faue
*/
public class Client {
private Socket mySocket;
/**
* 創(chuàng)建線程的構(gòu)造方法
*
* @param IP
* @throws IOException
*/
public Client(String IP) throws IOException {
try {
mySocket = new Socket(IP, 10000);
new Thread(new ServerMsgCollectThread(mySocket), "getAndShow"
+ mySocket.getPort()).start();
new Thread(new ClientMsgSendThread(mySocket), "send"
+ mySocket.getPort()).start();
} catch (IOException e) {
//e.printStackTrace();
System.out.println("Server.IP:" + IP
+ " port:10000 can not be Connected");
}
}
public static void main(String[] args) throws IOException {
try {
new Client(args[0]);
} catch (Exception e) {
System.out.println("輸入的IP地址錯誤");
}
}
/**
* 該類用于創(chuàng)建接收服務(wù)端發(fā)來的信息并顯示的線程
*
* @author Faue
* @version 1.0.0
*/
class ServerMsgCollectThread implements Runnable {
private Socket client;
private BufferedReader in;
private StringBuffer inputStringBuffer = new StringBuffer("Hello");
/**
* 得到Socket的輸入流
*
* @param s
* @throws IOException
*/
public ServerMsgCollectThread(Socket s) throws IOException {
client = s;
in = new BufferedReader(new InputStreamReader(client
.getInputStream(), "GBK"));
}
public void run() {
try {
while (!client.isClosed()) {
inputStringBuffer.delete(0, inputStringBuffer.length());
inputStringBuffer.append(in.readLine());
System.out.println(getMsg(inputStringBuffer.toString()));
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");
System.exit(0);
}
}
/**
* 構(gòu)造輸入字符串
*
* @param line
* @return
*/
private String getMsg(String line) {
return client.toString() + " says:" + line;
}
}
/**
* 該類用于創(chuàng)建發(fā)送數(shù)據(jù)的線程
*
* @author Faue
* @version 1.0.0
*/
class ClientMsgSendThread implements Runnable {
private Socket client;
private PrintWriter out;
private BufferedReader keyboardInput;
private StringBuffer outputStringBuffer = new StringBuffer("Hello");
/**
* 得到鍵盤的輸入流
*
* @param s
* @throws IOException
*/
public ClientMsgSendThread(Socket s) throws IOException {
client = s;
out = new PrintWriter(client.getOutputStream(), true);
keyboardInput = new BufferedReader(new InputStreamReader(System.in));
}
public void run() {
try {
while (!client.isClosed()) {
outputStringBuffer.delete(0, outputStringBuffer.length());
outputStringBuffer.append(keyboardInput.readLine());
out.println(outputStringBuffer.toString());
}
out.println("--- See you, bye! ---");
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");
System.exit(0);
}
}
}
}
如果對您有幫助,請記得采納為滿意答案,謝謝!祝您生活愉快!
vaela
文章題目:關(guān)于p2p服務(wù)端java代碼的信息
本文路徑:http://vcdvsql.cn/article4/ddpspoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、手機網(wǎng)站建設(shè)、用戶體驗、自適應(yīng)網(wǎng)站、網(wǎng)站制作、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)