2016-04-09 2 views
0

CクライアントのテキストをJavaのサブスクライバのリスト(異なるポートで受信している)に送信しようとしています。JavaサーバースレッドとCクライアントソケット接続

これを行うには、私はサブスクライバのリストをスクロールし、異なるサブスクライバへの接続を行い、それらにテキストを送信します。

ただし、サブスクライバへの接続に失敗します。

JAVA Serverスレッド:

import java.io.*; 
import java.net.*; 

public class ServerThread extends Thread { 
    private static ServerSocket _ss; 
    private static DataInputStream _in = null; 
    private static DataOutputStream _out = null; 
    private static BufferedReader _br = null; 

    private static String _topic = null; 

    public ServerThread(String string, ServerSocket ss, String topic) { 
     super(string); 
     _ss = ss; 
     _topic = topic; 
    } 

    public void run() { 
     String text; 

     try { 
      System.out.println("Listening on port " + _ss.getLocalPort()); 

      while(true) { 
       // Waiting connections    
       Socket sc = _ss.accept(); 

       // Input 
       _in = new DataInputStream(sc.getInputStream()); 
       _br = new BufferedReader(new InputStreamReader(_in)); 

       // Get text 
       while((text = _br.readLine()) != null) { 
        System.out.println("MESSAGE FROM " + _topic + " : " + text); 
       } 
      } 

     } catch(IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

} 

加入者へのSEND TEXT:

int send_text_subscriber(char *tp, char *text) { 
    struct topic *t; 
    struct subscriber *s; 
    int sd; 
    struct sockaddr_in subscriber; 

    t = find_topic(tp); 

    if(t != NULL) { 
     s = LIST_FIRST(&t->s_head); 

     if(!LIST_EMPTY(&t->s_head)) { 
      while(s != NULL) { 
       /* Open socket */ 
        if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
         perror("socket"); 
         return -1; 
        } 

       /* Set address */ 
       subscriber.sin_family = AF_INET; 
       subscriber.sin_addr = s->address.sin_addr; 
       subscriber.sin_port = s->address.sin_port; 

       /* Connect */ 
        if(connect(sd, (struct sockaddr*)&subscriber, sizeof(subscriber)) == -1) { 
         printf("\n > Error in the connection to the subscriber %s:%d\n", inet_ntoa(subscriber.sin_addr), subscriber.sin_port); 
         return -1; 
        } 

       /* Send text */ 
        printf("\n > Sending text to %s:%d... ", inet_ntoa(subscriber.sin_addr), subscriber.sin_port); 
        if(write(sd, text, strlen(text)) == -1) { 
         perror("write"); 
         return -1; 
        } 
        printf("[OK]\n\n"); 

       s = LIST_NEXT(s, entries); 
      } 
     } 
    } 

トピックへのサブスクリプションがsuccededされたとき、私は、サーバーのスレッドを作成:

static int subscribe(String topic) { 
     try { 
      // Open connection to the broker 
      _sd = new Socket(_server, _port); 
      _ss = new ServerSocket(0); // Server Socket Descriptor 

      _in = new DataInputStream(_sd.getInputStream()); 
      _out = new DataOutputStream(_sd.getOutputStream()); 

      // Send type operation 
      _out.write(SUBSCRIBE.getBytes(), 0, SUBSCRIBE.length()); 
      _out.write('\0'); 
      _out.flush(); 
      // Send the topic to subscribe to 
      _out.write(topic.getBytes(), 0, topic.length()); 
      _out.write('\0'); 
      _out.flush(); 
      // Send listening port 
      _out.writeShort((short)_ss.getLocalPort()); 
      _out.flush(); 

      // Get response from the broker 
      if(_in.read() == 0) { 
       System.out.println("c> SUBSCRIBE OK"); 

       // Create server thread 
       ServerThread t = new ServerThread("server", _ss, topic); 
       t.start(); 

      } else { 
       System.out.println("c> SUBSCRIBE FAIL"); 
      } 

      // Close connection 
      _in.close(); 
     _sd.close(); 

     } catch(IOException e) { 
     System.out.println("Error in the connection to the broker " + _server + ":" + _port); 
    } 

     return 0; 
    } 
+0

Javaの「ServerSocket」がどのように構築されているかを示していません。あなたが[mcve]を作成することができるのであれば、プログラムが印刷するものはほとんどまたは全く関心がありません。彼らはあなた自身の工夫のメッセージです。 – EJP

+0

非常に役に立ちます。 – Siguza

+0

システムコールからエラーが発生したときには、自分の意図したランダムなテキストだけでなく、 'perror()'と友人を使用してください。接続エラーが発生しました。それが何だった? – EJP

答えて

0

私は」 2つのことを変えて私の問題を解決しました:

subscriber.sin_port = htons(s->address.sin_port); 
  1. 私はアドレスは以下の形式でポートを格納するため、(ntohs)「をホストするためにネットワークから」、htonsを追加する必要がありました。
  2. 最後に、私はを忘れて、接続を閉じます
関連する問題