『壹』 java程序設計 TCP聊天程序 可以有多個客戶端
正好我在做這個,用多線程模型,一個用戶開一個線程,主線程負責死循環監聽連接,每次一個新連接就為那個用戶開一個線程,讀客戶端發來的信息
『貳』 java TCP做聊天程序是應該一個聊天窗口一個線程還是一個Socket一個線程
socket通訊是阻塞的,一個聊天就有一個socket,需要一直在哪裡阻塞讀取數據,所以就一個socket就要用一個線程了。如果用nio的話,通訊是非阻塞的,就不用一個聊天一個線程了。如果聊天人數大的話,建議用nio。現在netty框架就非常不錯。
『叄』 在java中 如何編寫tcp socket聊天室並且可以文件傳輸
這個用幾句話說不明白,Java程序設計(修訂本) 297頁里有源代碼,不過只是聊天兒程序,沒有文件傳輸,可以自己看著代碼加文件傳輸功能.
『肆』 java基於TCP/IP協議的聊天室伺服器如何捕獲客戶端的非正常退出
可以考慮在客戶端出現異常時給服務端發送信息,這個可能不完善,如果出現net之類異常就無法判斷。最好的方法是每隔一段時間服務端向客戶端發送特定信息,而客戶端獲取該特定信息後反饋以驗證socket的有效性。
『伍』 想用java做一個tcp的聊天室,請問一下如何在客戶端上獲得伺服器的客戶端列表
一般這種可以通過類似心跳的機制,就是定時向客戶端發送報文請求,請求中包含伺服器上的用戶列表,客戶端啟用埠監聽這個報文,接收到之後解析即可。
『陸』 我要一份用java網路編程寫的點對點的兩人聊天程序(TCP和UDP)
Server端:
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
}catch(Exception e) {
System.out.println("can not listen to:"+e);
}
Socket socket=null;
try{
socket=server.accept();
}catch(Exception e) {
System.out.println("Error."+e);
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+is.readLine());
line=sin.readLine();
while(!line.equals("bye")){
os.println(line);
os.flush();
System.out.println("Server:"+line);
System.out.println("Client:"+is.readLine());
line=sin.readLine();
}
os.close();
is.close();
socket.close();
server.close();
}catch(Exception e){
System.out.println("Error:"+e);
}
}
}
Client端:
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline;
readline=sin.readLine(); //從系統標准輸入讀入一字元串
while(!readline.equals("bye")){
os.println(readline);
os.flush();
System.out.println("Client:"+readline);
System.out.println("Server:"+is.readLine());
readline=sin.readLine(); //從系統標准輸入讀入一字元串
}
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯,則列印出錯信息
}
}
}
『柒』 用java編寫一個基於TCP的聊天室
在網路知道上面,搜索 JAVA SOCKET 聊天
『捌』 java tcp socket 通信問題
這兩個問題都可以通過消息機制來解決,
消息機制就是雙方約定的通信語言。
首先:你需要自定義一份雙方約定的通信機制,
其次: 對每個連進來的客戶按用戶ID或IP進行編號存入哈希表,以方便索引用戶的Socket通道。 每進來一個客戶就 hashtable.put(user.name, socket);
最後:雙方都還要有兩個緩沖數組(可以是數組Object[],也可以是Vector,Arraylist,Hashtable都可以);
一個叫發送緩沖區,一個叫接收緩沖區。每一個都附帶一個管理線程。
向客戶端發送消息時,並不是馬上就發送,而是將消息推入到發送緩沖區排隊,
發送緩沖區的線程會每隔一小片時間後就掃描並 pop出一個可發送的消息。
分析這個消息的源發送者和目的發送者,然後hashtable的索引找到目的發送者的socket通道。並發送.
另一個叫接收緩沖區。 Socket的網路線程不斷接收到客戶的消息,但不是馬上就處理,也不會自己親自處理,而是壓入接收緩沖隊列等待緩沖隊列來處理,自己休息片段又立馬再去接收別的客戶發過來的消息。 接收緩沖區有自己的線程,它每sleep一小片刻時間後就掃描隊列中有無消息到達,如果有(網路線程剛壓進一的),則可以採用監聽器模式讓監聽器處理,如果不想那麼復雜也可以自己處理, 會分析消息來源和去向,從去向中分析出將要發送給某人,但自己並不發送,而是直接壓入到發送緩沖區(這里就接到前面的發送緩沖區介紹中去了)
最後是消息機制的設計。
我公司的游戲都是由我來設計通信機制,實現三網合一,即手機,PC,電視機頂盒三種客戶端同玩一桌麻將游戲
一般java設計的游戲中設計如下:
一. 消息頭 二.消息體
消息頭設計格式如下: 1. 本消息包長度,以方便解析位元組;2. 本消息類型TYPE:如一般消息,游戲消息,大廳消息,聊天消息;3.本消息命令類型COMMAND: 如登陸、個人資料修改、登出、聊天。。。。
消息體設計格式一般根據Type和command不同而有不同。 如聊天消息包含四個欄位,String 聊天內容、 User 發送者、 User 接收者、Text文字排版信息
服務端SeverSocket收到這個消息後,壓入接收緩沖區, 接收緩沖線程分析其中結構,根據Type和Command的類型實例化出相應消息類, 該消息類能自動將後面的位元組流實例化自身的欄位。從而得到接收方和發送方, 得到接收方後再將消息封裝好壓入到發送隊列
這個結構除完全適合聊天系統以外,以後要加入新內容將會非常容易!
如果有什麼疑問歡迎call我, 我不負責寫代碼,但可以指點你。 另外,我的回答記錄中有用nio設計的聊天室BBS代碼。也是幫一個學生做的。你可以看看
『玖』 我用java編了一個tcp一對一聊天程序,只能發送文本,不能發圖片,求指明路,新手,多多包涵(^_^)∠※
首先將文件圖片讀到內存中,編下碼,比如base64什麼的,然後定義一個消息頭,告訴對方你發送的是什麼內容,然後開始發送,對方接到消息後,根據消息頭的內容處理消息
比如
-- 自定協議中,第一行信息為消息頭,00代表文本,接收方直接顯示,01代表圖像,就解碼,輸出圖像,02...;這個就隨你創意了
00
BalabalaBalabala...
方案二,先告訴對方你要發圖片,等待對方確認後,直接將圖像的byte[]發過去