2016-11-26 25 views
0

私は最近、ServerSocketとソケットで作業することを学んだので、少しチャットコンソールをプログラムしようとしています。しかし、私は問題がある、私は受信/私は間違って何かメッセージを送信していないですか?ソケットメッセージを送受信できません。

クラス:チャット(メイン)

package chatting; 

import java.util.Scanner; 

public class Chatting { 

public static Client client; 
public static Server server; 

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    System.out.print("Your username: "); 
    String name = sc.nextLine(); 
    System.out.print("connect to: "); 
    String ip = sc.nextLine(); 
    client = new Client(ip.split(":")[0], Integer.parseInt(ip.split(":")[1]), name); 
    while (true){ 
     String chat = sc.nextLine(); 
     client.send(chat); 
    } 
} 

} 

クラス:クライアント

package chatting; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

public class Client { 

Socket s; 

public Client(String ip, int port, String name){ 
    if (ip.equalsIgnoreCase("localhost")){ 
     Chatting.server = new Server(); 
    } 
    new Thread(new Runnable(){ 
     @Override 
     public void run(){ 
      try{ 
       s = new Socket(ip, port); 
       System.out.println("CONNECTION >> Waiting for conformation with name "+name+"!"); 
       send("#reg"+name); 
       WaitForMessage("#confirmed"); 
       System.out.println("CONNECTION >> You have been registered to server!"); 
       while (true){ 
        List<String> recieve = recieve(); 
        if (!recieve.isEmpty()){ 
         for (String str : recieve){ 
          System.out.println(str); 
         } 
        } 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 
} 

public void send(String msg){ 
    try{ 
     OutputStream os = s.getOutputStream(); 
     PrintWriter pw = new PrintWriter(new OutputStreamWriter(os), true); 
     pw.write(msg); 
     pw.flush(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

public List<String> recieve(){ 
    List<String> r = new ArrayList<String>(); 
    try{ 
     InputStream is = s.getInputStream(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     while ((line = br.readLine())!=null){ 
      System.out.println("CRECIEVE >> "+line); 
      r.add(line); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return r; 
} 

public void WaitForMessage(String msg){ 
    while (true){ 
     if (recieve().contains(msg)) break; 
    } 
} 
} 

クラス:サーバー

package chatting; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

public class Server { 

ServerSocket ss; 
List<Socket> s; 
HashMap<String, String> registered; 

public Server(){ 
    s = new ArrayList<Socket>(); 
    registered = new HashMap<String, String>(); 
    try { 
     ss = new ServerSocket(1234); 
     System.out.println("SERVER >> created server on port 1234!"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    new Thread(new Runnable(){ 
     @Override 
     public void run(){ 
      while (true){ 
       try{ 
        Socket socket = ss.accept(); 
        if (socket != null){ 
         System.out.println("SERVER >> client connected "+socket.getLocalAddress().toString()); 
         s.add(socket); 
        } 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 
    new Thread(new Runnable(){ 
     @Override 
     public void run(){ 
      while (true){ 
       for (Socket s : s){ 
        List<String> result = translate(recieve(s)); 
        if (!result.isEmpty()){ 
         for (String str : result){ 
          if (str.startsWith("#reg")){ 
           str = str.replaceAll("#reg", ""); 
           registered.put(s.getInetAddress().toString(), str); 
           System.out.println("SERVER >> user "+str+" on "+s.getLocalAddress().toString()+" registered!"); 
           send(s, "#confirmed"); 
          }else{ 
           sendToAll(registered.get(s.getLocalAddress().toString())+" >> "+str); 
          } 
         } 
        } 
       } 
      } 
     } 
    }).start(); 
} 

public void send(Socket s, String str){ 
    try{ 
     OutputStream os = s.getOutputStream(); 
     PrintWriter pw = new PrintWriter(new OutputStreamWriter(os), true); 
     pw.write(str); 
     pw.flush(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

public List<String> translate(String[] str){ 
    List<String> r = new ArrayList<String>(); 
    for (String s : str){ 
     r.add(s); 
    } 
    return r; 
} 

public String[] recieve(Socket s){ 
    String[] r = null; 
    try{ 
     ArrayList<String> lines = new ArrayList<String>(); 
     InputStream is = s.getInputStream(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println("SRECIEVE >> "+line); 
      lines.add(line); 
     } 
     r = new String[lines.size()]; 
     for (int i = 0; i < lines.size(); i++){ 
      r[i] = lines.get(i); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return r; 
} 

public void sendToAll(String str){ 
    for (Socket soc : s){ 
     send(soc, str); 
    } 
} 

私の問題は、単に何もメッセージを受信して​​いない取得される/送られました。 は、私はそれは、クライアントを起動し、完全に接続しているサーバを起動し、私は

try{ 
       s = new Socket(ip, port); 
       System.out.println("CONNECTION >> Waiting for conformation with name "+name+"!"); 
       send("#reg"+name); 
       WaitForMessage("#confirmed"); 
       System.out.println("CONNECTION >> You have been registered to server!"); 
       while (true){ 
        List<String> recieve = recieve(); 
        if (!recieve.isEmpty()){ 
         for (String str : recieve){ 
          System.out.println(str); 
         } 
        } 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 

Nothingに到達したときはもう発生した場合。

+0

あなたが何をしているのか、本当に混乱しているのかを本当に知っていない限り、ストリームを2回以上ラップしないでください。 Socketの入力ストリームと出力ストリームをSocketのライフサイクルで一度だけラップします。 –

+0

@RoflFrankocにはどのようなエラーがありますか? –

+0

@PeterLawreyはそれが本当にそれが目的地に届かない原因になっていますか? – RoflFrankoc

答えて

0

あなたは行を読んでいますが、行は書いていません。 write()の代わりにprintln()を使用してください。 @PeterLawreyも言及したすべてを修正する。 readLine()がnullを返す場合は、ソケットを閉じて読み取りを停止します。

関連する問題