Re: [問題] 請問要寫MultiThread的TCPserver該讀哪 …
※ 引述《dream1124 (喔不~~我不要當阿宅!!)》之銘言:
: 如題
: 有一份作業是要寫一個TCP server,讓多個(但有數量上限)client同時連上來存取資料
: 為了這份作業,我這完全沒寫過multiThread的新手已經翻了好幾本書
: 卻感到還是沒辦法解決問題,也許是資料沒有找對的緣故吧....
: 因此上來想請大家指點一下該去翻哪些書....
: 若有問不到要領的地方麻煩請別鞭太大力 >.<
: 這個TCP server要不斷地接受client端的request以改變server端的一些儲存紀錄
: 本來是想說一開始new 一個serverSocket物件
: ServerSocket XXX = new ServerSocket("localhost", 6789);
: 再來 new 一個 Socket變數,以取得上面serverSocket accept()之結果
: Socket connectionSocket = XXX.accept();
: 由於老師說,在上面這行時,java平台已經替這道連線另外開好一條連線了,
: 因此XXX這個ServerSocket可以再去監聽有無新的連線進來
: 所以server端的大致運作是這樣的
: private ServerSocket XXX;
: private connectionSocket;
: 在程式主體中︰
: while(true) {
: Socket connectionSocket = XXX.accept();
: 接下來將connectionSocket丟到某個implements Runnable的inner class
: 然後利用 Executor的ThreadPool產生一個新的thread以處理來自這個Socket
: 的request
: 最後 XXX.close(); <---這個在while中????
: }
: 請問這樣子的寫法有搞頭嗎?
: 又因為每一個連線所產生的thread都會存取到server的全域變數,
: 請問該讀哪些書才能解決這些連線搶資源的問題呢?
: 老師是叫我去看 thread safty的書,可是這領域也太大了吧 (汗)
不要直接存取全域變數 透過 函式存取 並在 函式名字加
syncrhonized 來同步
如果不想這樣 似乎也可以直接在變數前加上volatile來修飾
: 不知道有哪個地方是會講些比較容易上手的實作方式,能較快上手的呢?
: 而且目前會使用的threadpool 也只有 executors中的 newFixedThreadPool
: 如果今天超出伺服器限制的client要連過來,那麼java究竟會如何與
: 超出threadpool數量上限的連線互動呢?
: 謝謝指教
class MyServer extends Thread (or implements Runnable){
Vector connVector; <--存放所有的client
public void run(){
while(true){
Socket conn = socket.accept();
connVector.add(new MyClient(conn));
}
}
}
class MyClient extends Thread (or implements Runnable){
Socket socket;
BufferedReader br;
BufferedWriter bw;
public MyClient(Socket s){
socket = s;
//接BufferedReader BufferedWriter 啟動thread
}
public void run(){
while(br.readline()){
//這邊接受單一client傳送過來的資訊
}
}
public void sendMsg(String msg){
bw.send(msg);
bw.flush(); // 傳送指令至client
}
}
所以你的程式至少有 2+n 條thread
一條主要thread
一條專門來accpet client連線的thread
n代表 每有一個連線進來 建立一條thread來收取他傳送過來的資料
軟工作業吧XDD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.237.63
推
11/05 19:29, , 1F
11/05 19:29, 1F
→
11/05 19:47, , 2F
11/05 19:47, 2F
→
11/05 20:12, , 3F
11/05 20:12, 3F
→
11/06 08:52, , 4F
11/06 08:52, 4F
推
11/07 12:34, , 5F
11/07 12:34, 5F