新聞中心
廣域網(wǎng)實(shí)現(xiàn)p2p文件傳輸 如何實(shí)現(xiàn)nat穿透 求java或C++源代碼
假設(shè)有兩臺分別處于各自的私有網(wǎng)絡(luò)中的主機(jī):A和B;N1和N2是兩個(gè)NAT設(shè)備;S是一個(gè)使用了一個(gè)眾所周知的、從全球任何地方都能訪問得搏拍含到的IP地址的公共服基笑務(wù)器
10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有昆玉免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
步驟一:A和B分別和S建立UDP連賀纖接;NAT設(shè)備N1和N2創(chuàng)建UDP轉(zhuǎn)換狀態(tài)并分配臨時(shí)的外部端口號
步驟二:S將這些端口號傳回A和B
步驟三:A和B通過轉(zhuǎn)換好的端口直接聯(lián)系到對方的NAT設(shè)備;NAT設(shè)備則利用先前創(chuàng)建的轉(zhuǎn)換狀態(tài)將分組發(fā)往A和B
源碼已發(fā)送請查收
求javap2p聊天工具代碼
JAVA賀新態(tài)知年-自己動手做QQ(P2P聊天工具含源碼) - Dreamcode ~ ...
區(qū)襲閉答塊拍慧鏈中的消息傳播離不p2p通信 java實(shí)現(xiàn)一個(gè)簡單的p2p通信demo工具: idea jdk1.8 maven1 : idea新建maven項(xiàng)...
基于java的p2p實(shí)現(xiàn)文件共享和傳輸
在JAVA中,發(fā)送和接收多播信息的方法:?
發(fā)送多播信息需經(jīng)歷步驟?
確定發(fā)送的具體信息內(nèi)容?
String msg = "Hello";?
選用專門為多播指定的D類IP地址(224.0.0.1到239.255.255.255),創(chuàng)建一個(gè)多播組?
InetAddress group = InetAddress.getByName("228.5.6.7");?
使用指定的端口(一般選1024以上的端口號)建立多播套接字?
MulticastSocket s = new MulticastSocket(6789);?
加入多播組?
s.joinGroup(group);?
創(chuàng)建一個(gè)數(shù)據(jù)報(bào)封裝多播信息?
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),?
group, 6789);?
發(fā)送?
s.send(hi);?
接收多播信息的步驟?
開辟接收緩沖區(qū)?
byte[] buf = new byte[1000];?
創(chuàng)建接收數(shù)據(jù)報(bào)?
DatagramPacket recv = new DatagramPacket(buf, buf.length);?
接收?
s.receive(recv);?
注意:以上發(fā)送和接收程序在同一個(gè)文件中實(shí)現(xiàn),若在不同文件中實(shí)現(xiàn)則應(yīng)分別定義多播套接字并加入多播組。?
3.與已知IP和端口的端點(diǎn)通信?
在互聯(lián)網(wǎng)上主要采用TCP和UDP來實(shí)現(xiàn)兩點(diǎn)之間的通信。采用TCP可可靠傳送信息,但花費(fèi)時(shí)間較多;采用UDP可快速傳遞信息,但不能保證可靠傳遞。
JAVA實(shí)現(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()返回一個(gè)最近創(chuàng)建的Socket對象,該Socket對象綁定了客戶程序的IP地址或端口號。通過調(diào)用Socket的 getInputStream()方法獲得輸入流讀傳送輪伍來的信息,也可能通過調(diào)用Socket的 getOutputStream()方法獲得輸出流來發(fā)送消息。?
JAVA實(shí)現(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è)計(jì)的程序采用UDP。
P2P(Peer-to-Peer 端到端)模型是與C/S(客戶/服務(wù)器)模型相對應(yīng)。基于C/S的用戶間通信需要由服務(wù)器中轉(zhuǎn),在C/S中的服務(wù)器故障將導(dǎo)致整個(gè)網(wǎng)絡(luò)通信的癱瘓此卜。。而基于P2P的用戶間通信則是直接通信,去掉了服務(wù)器這一層,帶來的顯著優(yōu)點(diǎn)是通信時(shí)沒有單一的失敗點(diǎn),一個(gè)用戶的故障不會影響整個(gè)P2P網(wǎng)絡(luò)。本文提供了一種用JAVA實(shí)現(xiàn)P2P網(wǎng)絡(luò)通信的方法。 ?
用java多線程實(shí)現(xiàn)服務(wù)器與客戶端之間的文件傳輸?shù)拇a?。。〖保。。。?/h2>
程序分Server和Client
服務(wù)器端打開偵聽的端口,一有客戶端連衡昌接就創(chuàng)建兩個(gè)新的線程來負(fù)責(zé)這個(gè)連接
一個(gè)負(fù)責(zé)客戶端發(fā)送的信息(ClientMsgCollectThread 類),
另一個(gè)負(fù)責(zé)老攔薯通過該Socket發(fā)送數(shù)據(jù)(ServerMsgSendThread )
Server.java代碼如下:
/*
* 創(chuàng)建日期 2009-3-7
*
* TODO 要更改此生成的文件的模板,請轉(zhuǎn)至
* 窗口 - 首選項(xiàng) - Java - 代碼樣式 - 代碼模板
*/
package faue.MutiUser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java點(diǎn)虐 .ServerSocket;
import java點(diǎn)虐 .Socket;
/**
* 服務(wù)器端
*
* @author Faue
*/
public class Server extends ServerSocket {
private static final int SERVER_PORT = 10000;
/**
* 構(gòu)造方法,用于實(shí)現(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!");
}
}
}
}
客戶端:
實(shí)現(xiàn)基于IP地址的連接,連接后也創(chuàng)建兩個(gè)線程來實(shí)現(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點(diǎn)虐 .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地址錯(cuò)誤");
}
}
/**
* 該類用于創(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
當(dāng)前文章:關(guān)于p2p服務(wù)端java代碼的信息
本文路徑:http://fisionsoft.com.cn/article/ddpspoe.html