作者neigence ()
站内java
标题Re: [问题] 请问要写MultiThread的TCPserver该读哪 …
时间Thu Nov 5 10:30:13 2009
※ 引述《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
1F:推 petertc:main thread和accept client可以在一起吧 11/05 19:29
2F:→ neigence:不行 accpt必须永远停在一个while 一直等待新连线 11/05 19:47
3F:→ sbrhsieh:为什麽不能让 main thread 一直做 accept 这件事?! 11/05 20:12
4F:→ neigence:啊 可能是我误会了 我想成ui-thread 11/06 08:52
5F:推 dream1124:感恩~ 11/07 12:34