2016-11-26 213 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(); 
      } 

再也沒有發生。

+0

除非你真的知道你在做什麼或者你真的很喜歡混亂,在Socket的生命週期中,將套接字的輸入和輸出流封裝一次。 –

+0

你有什麼錯誤@RoflFrankoc? –

+0

@PeterLawrey是否真的使它無法到達目的地? – RoflFrankoc

回答

0

您正在閱讀的文章,但您並未撰寫文章。使用println()而不是write()。並修復@PeterLawrey提到的所有內容。如果readLine()返回null,則關閉套接字並停止讀取。