2016-06-07 6 views
0

Я пытаюсь написать приложение для настольных чатов с использованием сокетов, и я намерен создать систему обмена сообщениями, которая использует одноранговую связь между клиентами.Peer-to-Peer Messenger

Если у меня есть IP-адреса предполагаемых получателей, могу ли я напрямую подключиться к клиенту, не беспокоясь о промежуточном сервере?

Если бы кто-нибудь мог помочь мне указать мне в правильном направлении, я бы очень признателен.

+0

Короткий ответ: да. Вы должны иметь возможность напрямую подключаться к любому внешнему IP-адресу, учитывая, что он не заблокирован брандмауэром или плохой связью. Если вам нужна только одноранговая связь, а не групповой мессенджер, это должно быть довольно легко написать, используя базовые сокеты. – venture

+0

Звучит как-то для веб-сайтов. Я думаю, что пакет 'javax.websocket' довольно прост в использовании. Это может помочь: http://stackoverflow.com/questions/26452903/javax-websocket-client-simple-example – Gendarme

ответ

0

Да, если вы знаете, каковы адреса ваших получателей, это довольно легко. Просто отправлять сообщения в виде обычного текста через соединение, разделенные новой линии, нуль-терминатором, писать длину сообщения перед текстом и т.д.
Ниже приведен пример класса для клиента сети:

import java.net.Socket; 
import java.net.InetAddress; 
import java.net.SocketTimeoutException; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.InputStream; 

public class Networker{ 
    private Socket conn; 

    public void connectTo(InetAddress addr)throws IOException{ 
     conn = new Socket(addr, 8989); //Second argument is the port you want to use for your chat 
     conn.setSoTimeout(5); //How much time receiveMessage() waits for messages before it exits 
    } 

    public void sendMessage(String message)throws IOException{ 
     //Here I put one byte indicating the length of the message at the beginning 
     //Get the length of the string 
     int length = message.length(); 

     //Because we are using one byte to tell the server our message length, 
     //we cap it to 255(max value an UNSIGNED byte can hold) 
     if(length > 255) 
      length = 255; 

     OutputStream os = conn.getOutputStream(); 
     os.write(length); 
     os.write(message.getBytes(), 0, length); 
    } 

    //Checks if a message is available 
    //Should be called periodically 
    public String receiveMessage()throws IOException{ 
     try{ 
      InputStream is = conn.getInputStream(); 

      int length = is.read(); 

      //Allocate a new buffer to store what we received 
      byte[] buf = new byte[length]; 

      //The data received may be smaller than specified 
      length = is.read(buf); 

      return new String(buf, 0, length); 
     }catch(SocketTimeoutException e){} //Nothing special, 
     //There was just no data available when we tried to read a message 
     return null; 
    } 
} 

Хотя, Я слышал, что некоторые брандмауэры блокируют входящие соединения, и в этом случае вы должны использовать UDP. Проблема с ней заключается в том, что ее ненадежность (иначе, если вы просто отправляете сообщения, они могут не прийти к дестанации)

Реальная проблема с P2P в моем решении - найти сверстников (на самом деле, только один необходим , потому что после этого наш новый сверстник расскажет нам о своих сверстниках, и об этих сверстниках об их сверстниках и т. д.)