Re: [問題] 請問要寫MultiThread的TCPserver該讀哪 …

看板java作者時間16年前 (2009/11/05 10:30), 編輯推噓2(203)
留言5則, 4人參與, 最新討論串1/1
※ 引述《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
main thread和accept client可以在一起吧
11/05 19:29, 1F

11/05 19:47, , 2F
不行 accpt必須永遠停在一個while 一直等待新連線
11/05 19:47, 2F

11/05 20:12, , 3F
為什麼不能讓 main thread 一直做 accept 這件事?!
11/05 20:12, 3F

11/06 08:52, , 4F
啊 可能是我誤會了 我想成ui-thread
11/06 08:52, 4F

11/07 12:34, , 5F
感恩~
11/07 12:34, 5F
文章代碼(AID): #1AyZYtd4 (java)