谁来帮我看看这段代码。拉兄弟一把吧(多线程问题-在线等)

jackal81 2003-04-01 02:03:34
import java.net.*;
import java.io.*;

public class MTServerBase extends Thread{

protected Socket socket;
public void run(){
try{
String s = "I am a test server.Goodbye";
socket.getOutputStream().write(s.getBytes());
socket.close();
}catch(Exception e){
System.out.println(e);
}
}
static public void startServer(int port,class clobj){
ServerSocket ssock;
Socket sock;
try{
ssock=new ServerSocket(port);
while(true){
Socket esock=null;
try{
esock=ssock.accept();
MTServerBase t = (MTServerBase)clobj.newInstance();
t.socket=esock;
t.start();
}catch(Exception e)
try{esock.close();}catch(Exception ec){}
}
}
}catch(IOException e){

}
}

static public void main(String args[]){
System.out.println("Starting server on port 808");
MTServerBase.startServer(808,MTServerBase.class);
}
}
书上说这是一个多线程的例子,请教这里的startServer(int port,class clobj)怎么理解?其中的Socket sock;并没有用到呀为什么还要定义呢?整个类是怎么实现的?
...全文
31 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
buick555 2003-04-03
  • 打赏
  • 举报
回复
作用是一样的,都是创建一个类的实例!
duodonglai 2003-04-02
  • 打赏
  • 举报
回复
程序中的:
MTServerBase t = (MTServerBase)clobj.newInstance();
改成:
MTServerBase t = new MTServerBase();

可以吗?如果可以,这两个有什么区别吗?
takecare 2003-04-02
  • 打赏
  • 举报
回复
newInstance
创建一个新的实体,跟class.forname()差不多。主要目的是创建一个类的实体。
buick555 2003-04-02
  • 打赏
  • 举报
回复
本人认为思路如下。设计比较巧妙。
首先定义一个MTServerBase的基类,继承线程。覆盖掉run方法具体内容是有一个client连上后,就向他发送一个I am a test server.Goodbye字符串然后关闭连接,线程结束。
这样看来,他只能同时接收一次呼叫。但是,static public void startServer(int port,class clobj)这个方法就派上了用场,这样定义是有理由的,1:为static的,可以从外部动态改变端口号和实现基类。2:也就是最重要的一点是他是static是不属于对象的,在对象加载时有了,给他端口号和实现server功能的基类后,他就会根据定制创建端口号,然后利用类在内存中的反射Class类(这是java的重要方法,你执行main时,这个类虽然没有初始化,但是在内存中已经有了这个类在内存中的反射类这是继承了java.lang.Class的一个类,里面有关于MTServerBase类的属性和方法描述,但这不是MTServerBase的对象!注意)用一个死循环。这个时候,你再用newInstance方法得到他的一个实例(这个方法在jdbc中常用,是超越new方法之上的实例化方法,对Class类的子类起作用也就是MTServerBase的那个反射类)因为MTServerBase继承线程类,就可以不断创建server类来服务与这个端口相连的client,从而实现了同时处理功能。还有protected Socket socket用到了,在while循环里。问题你可以qq和我联系
takecare 2003-04-01
  • 打赏
  • 举报
回复
呵呵,现在应该清楚了吧。
takecare 2003-04-01
  • 打赏
  • 举报
回复
对!
takecare 2003-04-01
  • 打赏
  • 举报
回复
startServer(int port,class clobj)
^^^^^^^^^^^
因为这是静态方法,所以使用这个参数来构造
MTServerBase t = (MTServerBase)clobj.newInstance();

该程序的目的:
startServer:构造MTServerBase,并创建Socketserver开始侦听,
如果有连接请求则开服务线程(run中所实现的)。
jackal81 2003-04-01
  • 打赏
  • 举报
回复
他是不是在调用自己本身的类呢?newInstance()是什么意思?
season_fly 2003-04-01
  • 打赏
  • 举报
回复
大概意思好象是循环里不停地启用线程,输出String s ,输出完后就停止该线程
season_fly 2003-04-01
  • 打赏
  • 举报
回复
这个程序的思路,我不好说~~也想听听大家的意见~
jackal81 2003-04-01
  • 打赏
  • 举报
回复
能具体解释一下程序吗?能具体解释一下程序吗?能具体解释一下程序吗?能具体解释一下程序吗?能具体解释一下程序吗?能具体解释一下程序吗?能具体解释一下程序吗?
谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了谢谢了
goodgoodgood 2003-04-01
  • 打赏
  • 举报
回复
up
season_fly 2003-04-01
  • 打赏
  • 举报
回复
书上经常有写错的时候,这个Socket sock;好象是没用到吧
startServer(int,class)MTServerBase类中的一个静态方法,没什么特别的啊
jackal81 2003-04-01
  • 打赏
  • 举报
回复
我对整个程序的思想不理解能不能解释一下?
takecare 2003-04-01
  • 打赏
  • 举报
回复
我想本来该程序的作者可能是想在while循环里用的。但是这样会出现问题的。
takecare 2003-04-01
  • 打赏
  • 举报
回复
对,应该没有用到。嘻嘻。
jackal81 2003-04-01
  • 打赏
  • 举报
回复
t.socket=esock用到的是类开始是定义的protected Socket socket;吧不是我说的那个sock阿
takecare 2003-04-01
  • 打赏
  • 举报
回复
startServer静态方法,可以直接在main方法中调用。


"并没有用到呀为什么还要定义呢?"
t.socket=esock; //用到了吗?
t.start(); //开始线程

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧