jsocket(1)
陆子默
2023-12-01
public class MySocket extends TcpSocket
{
public MySocket(SocketHandler h)
{
super(h);
SetLineProtocol();
}
public void OnAccept()
{
Send("Welcome\r\n");
}
public void OnLine(String line)
{
Send("You said: " + line + "\r\n");
if (line.equals("quit"))
{
Send("Goodbye!\r\n");
SetCloseAndDelete();
}
}
public static void main(String[] args)
{
//初始化日志,为传入SocketHandler网络处理类作准备
StdLog log = new StdoutLog();
//做的事情就是将log传入到SocketHandler类中,在这个类中要使用StdLog进行日志的记录,还有会初始化一个Selector和存放Socket的Vector。Selector类与SocketHandler关联,因为SocketHandler的主要任务就是处理Selector不同感兴趣的事件,然后由TcpSocket进行详细的处理
SocketHandler h = new SocketHandler(log);
//首先它会先去初始化MySocket类,MySocket类继承的是TcpSocket类,那么它会去调用TcpSocket的构造方法,TcpSocket的构造方法做的一些事情:
1,首先TcpSocket的构造方法会先去调用它的父类Socket的构造方法,然后它会先把SocketHandler对象h传递给TcpSocket的父类Socket,父类拥有SocketHandler对象,
2,因为TcpSocket是用来处理数据的类,所以它在初始化的过程中会申请缓冲区等任务。
接着就是调用ListenSocket类的构造方法,ListenSocket类主要是用来连接和取消的任务的,那么TcpSocket的构造方法做了什么事:
1,首先会去调用ListenSocket父类Socket构造方法,把SocketHandler对象h传递给ListenSocket的父类Socket
2,把MySocket对象传入到ListenSocket类中
ListenSocket l = new ListenSocket(h, new MySocket(h));
//建立连接,建立连接的方法与普通的建立一样
但是Bind方法做了一步 attach(ssc);//将ServerSocketChannel设置到ListenSocket里面,方便下去取到ServerSocketChannel对象
if (l.Bind(8000) == 0) // listen on port 8000 监听端口号
{
h.Add(l);//如果有新用户连接上来,则进行Add处理
}
boolean quit = false;
while (!quit) // forever
{
h.Select(1, 0);//对不同感兴趣的SelectionKey进行处理
}
}
}
下面看看源码。。。