1. 程式人生 > 實用技巧 >簡易版聊天室-Java-socket

簡易版聊天室-Java-socket

隨筆

已經有半個月沒寫文件了,到了大二,我深刻體會到了程式語言的博大精深,於是我陷入了思考,到底什麼樣算是會程式設計呢?我發現在一些Java書籍中,僅僅只是介紹了常用程式碼的使用方式,及作用,並沒有涉及底層,構造原理,不懂底層也就談不上修改,優化了,每當在寫程式碼的時候,明明一個API下有那麼多方法,我卻僅僅只認得那麼一兩個方法,很多索引出的內容都要通過記憶單詞的方式去過濾,學習知識都是照搬照抄,我真的瞭解程式設計嗎?我想我並不會程式設計,我所使用的程式設計都是遵循原有的規則去實現的,那麼這樣走下去,我想我不會是一個程式設計師,頂多算一個程式碼搬運工,深知現狀卻無能為力,感慨萬千:人生好難!

socket實現簡易聊天室

原始碼1

package demo;
import java.net.*; 
import java.io.*; 
import java.util.*; 
 
public class Server { 
  int port; 
  List<Socket> clients; 
  ServerSocket server; 
  public Server() { 
try { 
  port = 8083; 
  clients = new ArrayList<Socket>(); 
  server = new ServerSocket(port); 
  System.out.println("伺服器已啟動"); 
  int co=1; 
  while (true) { 
    Socket socket = server.accept(); 
    clients.add(socket); 
    Mythread mythread = new Mythread(socket,co); 
    co++; 
    mythread.start(); 
  } 

} catch (Exception ex) { 
  System.out.println("vv"); 
} 
} 

public static void main(String[] args) { 
new Server(); 
} 

class Mythread extends Thread { 
Socket ssocket; 
private int count; 
private BufferedReader br; 
private PrintWriter pw; 
public String msg; 

public Mythread(Socket s,int c) { 
  ssocket = s; 
  count=c; 
} 

public void run() { 

  try { 
    br = new BufferedReader(new InputStreamReader(ssocket.getInputStream())); 
     
    msg = "歡迎【" +"Client "+count + "】進入聊天室!當前聊天室有【" + clients.size() + "】人"; 

    sendMsg(); 

    while ((msg = br.readLine()) != null) { 
       
      msg = "【" +"Client "+count + "】說:" + msg; 

      sendMsg(); 
      
    } 
  } catch (Exception ex) { 
  } 
} 
public void sendMsg() { 
  try { 
    System.out.println(msg); 

    for (int i = clients.size() - 1; i >= 0; i--) { 
      pw = new PrintWriter(clients.get(i).getOutputStream(), true); 
      pw.println(msg); 
      pw.flush(); 
    } 
  } catch (Exception ex) { 
  } 
} 
} 
} 

原始碼2

package demo;
import java.io.*; 
import java.net.*; 
import java.util.*; 
 
public class Client { 
 public int port = 8083; 
 Socket socket = null; 
 
 public static void main(String[] args) { 
  new Client(); //開始執行 
 } 
 
 public Client() { 
 
  try { 
   socket = new Socket("127.0.0.1", port); 
   new Cthread().start(); 
 
   BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
   String msg1; 
   while ((msg1 = br.readLine()) != null) { 
System.out.println(msg1); 
   } 
  } catch (Exception e) { 
 	} 
 } 

 class Cthread extends Thread { 
 
  public void run() { 
   try { 

BufferedReader re = new BufferedReader(new InputStreamReader(System.in)); 
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); 
String msg2; 

while (true) { 

 msg2 = re.readLine(); 
 pw.println(msg2); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
   } 
 
  } 
 } 
 
}


最終效果圖,當然這樣是無法實現多人線上聊天的,可以通過telnet來實現線上聊天,只不過這個聊天室是一個匿名的,基於cmd視窗。

實現多人線上聊天

1.開啟控制面板

2.找到功能和程式

3.選擇啟用或關閉Windows功能

4.開啟Windows當中的telnet功能

5.win+R--->cmd-->輸入telnet 127.0.0.1 埠號


如果讓別的電腦連線聊天室需要將本機電腦的防火牆關閉(對方電腦與本機必須處於同一區域網下,否則需要將本機電腦的ip地址對映到公網上)

可能發生的問題

無法開啟到主機的連線 埠23失敗?
可能是埠錯了,因為telnet的預設連線埠是23

格式:

telnet不僅僅能連線23埠,但是telnet預設連線是23埠
要連線其他埠,在cmd打命令
telnet 192.168.1.1 135,中間沒有“:”,是一個空格`這樣telnet就連線到了對方的135埠`