为什么ServerSocket在Socket没有调用NetworknOnMainThread时呢?

时间:2013-02-19 23:32:31

标签: android exception network-programming

server = new ServerSocket(PORT);

不会在我的应用程序上调用NetworkOnMainThreadException,我认为它应该执行并编辑代码以在另一个线程上运行

socket= new Socket(ADDRESS,PORT);

会正确调用NetworkOnMainThreadException。我错过了什么或是否应该修复错误?

2 个答案:

答案 0 :(得分:3)

为什么要这样? new ServerSocket(...)只是一个本地操作。它不涉及任何实际的网络活动,而new Socket(...)可以,并且它可以阻止长达一分钟左右。

答案 1 :(得分:1)

当你拨打新的Socket(ADDRESS,PORT)时;

private Socket(SocketAddress address, SocketAddress localAddr,
413                    boolean stream) throws IOException {
414         setImpl();
415 
416         // backward compatibility
417         if (address == null)
418             throw new NullPointerException();
419 
420         try {
421             createImpl(stream);
422             if (localAddr != null)
423                 bind(localAddr);
424             if (address != null)
425                 connect(address);
426         } catch (IOException e) {
427             close();
428             throw e;
429         }
430     }

它创建了流。而server = new ServerSocket(PORT);

public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
230        setImpl();
231        if (port < 0 || port > 0xFFFF)
232            throw new IllegalArgumentException(
233                       "Port value out of range: " + port);
234        if (backlog < 1)
235          backlog = 50;
236        try {
237            bind(new InetSocketAddress(bindAddr, port), backlog);
238        } catch(SecurityException e) {
239            close();
240            throw e;
241        } catch(IOException e) {
242            close();
243            throw e;
244        }
245    }

注意没有connect();,这些方法都不涉及网络操作,因此您无法获得NetworkOnMainThreadException