NutzCN Logo
问答 Scocket 这块代码 有demo码? 我的demo跑起来挂起了
发布于 2611天前 作者 Leewell1989 2023 次浏览 复制 上一个帖子 下一个帖子
标签:

看了下nutz里边关于socket的代码,试着写了下:
服务端

public void start(){
        int port = 10086;
        Map<String, SocketAction> actions = new HashMap<String, SocketAction>();
        actions.put("T1001", new T1001());
        int poolSize = 10;
        Sockets.localListenByLine(port, actions, poolSize);
    }

SocketAction的实现:

public class T1001 implements SocketAction {

    @Override
    public void run(SocketContext context) {
        System.out.println("T1001");  //这一句进不来
    }

}

启动:

 @Test
    public void start() throws Exception {
        new MainModule().start();
    }

调用:

@Test
    public void testListen(){
        System.out.println(Sockets.sendText("127.0.0.1",10086, "admin"));
    }

服务端日志:

17-9-21 17:14:23.703 INFO [main] Select SystemLog as Nutz.Log implement
17-9-21 17:14:23.712 INFO [main] Local socket is up at :10086 with 1 action ready
17-9-21 17:14:23.720 DEBUG [main] Waiting for new socket
17-9-21 17:14:38.30 DEBUG [main] accept a new socket, create new SocketAtom to handle it ...
17-9-21 17:14:38.31 DEBUG [main] Waiting for new socket
17-9-21 17:14:38.31 DEBUG [pool-1-thread-1] connect with '/127.0.0.1:58407'

客户端日志:

17-9-21 17:14:38.20 INFO [main] Select SystemLog as Nutz.Log implement

现在问题是不进我自己的SocketAction实现,这个要怎么写?还有没有其他什么漏掉的东西?

22 回复

嗯,话说你登记的是T1001,发送的是admin ?

额,其实我是没太懂你的实现-_-!

 @Test
    public void testListen(){
        System.out.println(
                Sockets.sendText(
                        "127.0.0.1",
                        10086,
                        "T1001"));
    }

这样也还是没进去

 @Test
    public void testListen(){
        System.out.println(
                Sockets.sendText(
                        "127.0.0.1",
                        10086,
                        "T1001\r\n"));
    }

还是不进去,SocketAtom中只进了构造,没有run和doRun,对这块流程有点模糊
步骤是否是这样子:
定义SocketAction实现-->登记执行动作-->监听端口
发送调用

还有就是服务端代码只看到接收消息,响应在哪里实现的没看到,如果需要自己实现的话,应该写在哪里?
这块刚接触,求指点。

额,不会吧

基本处理过程就是: 监听 --> 生成SocketAtom --> 读取一行, 匹配Action名称, 执行--> 继续下一行

你可以debug一下org.nutz.lang.socket.SocketAtom.doRun() ,看看发生了什么

SocketAtom只调用了构造

public SocketAtom(Context context, Socket socket, SocketActionTable saTable) {
        this.context = context;
        this.socket = socket;
        this.saTable = saTable;
    }

doRun方法没进去,
到这一句, Sockets.localListen()的263行:

service.execute(runnable);

直接跳过去了

刚试了一下

package org.nutz.lang;

import java.util.HashMap;
import java.util.Map;

import org.nutz.lang.socket.SocketAction;
import org.nutz.lang.socket.SocketContext;
import org.nutz.lang.socket.Sockets;

public class SocketsTest {

    public static void main(String[] args) {
        int port = 8181;
        final Map<String, SocketAction> actions = new HashMap<String, SocketAction>();
        actions.put("T001", new SocketAction() {
            
            @Override
            public void run(SocketContext context) {
                System.out.println("aaaaa");
                context.write("hi, wendal\r\n");
                Streams.safeClose(context.getOutputStream());
            }
        });
        new Thread() {
            public void run() {
                Sockets.localListenByLine(8181, actions);
            };
        }.start();
        Lang.quiteSleep(1000);
        String resp = Sockets.sendText("127.0.0.1", port, "T001\r\n");
        System.out.println("resp = " + resp);
        Lang.quiteSleep(1000);
    }
}

调通了,有两个地方不太理解:
1.启动监听为什么要单开一个线程?直接启动为啥就不行?

public void start(){
        final int port = 10086;
        final Map<String, SocketAction> actions = new HashMap<String, SocketAction>();
        actions.put("T1001", new T1001());
       // Sockets.localListenByLine(port, actions);
        new Thread() {
            public void run() {
                Sockets.localListenByLine(port, actions);
            };
        }.start();
        Lang.quiteSleep(1000);
    }

2.testcase执行完,这个进程直接退了?main方法中启动则一直可以监听
public static void main(String[] args){
new MainModule().start();
}

@Test
public void start() throws Exception {
    new MainModule().start();
}

登记多个执行动作的时候,如何在请求端制定要执行哪个动作并且传递相应参数ne ?

... 你想有状态啊... 我建议还是走http吧...

后边回加入文件传输,怕http效率差。

http方便扩展呢

主要是怕文件量比较大的情况下http达不到效率要求。

仅比socket多了1k的头部,不是瓶颈的

安全性呢?我见过的这类应用好像都是走socket

http反而简单多了,扩展性也确实更强

添加回复
请先登陆
回到顶部