我正在尝试在Java中使用带有SSL的自定义SocketImpl.因为我需要设置ServerSocket的套接字工厂.我现在注意到它是静态的,这给我带来了一些麻烦,因为我想为它提供一些在每个ServerSocket实例之间不同的参数.有谁知道让它静止的理由?对我来说,感觉就像一个不必要的约束,只会在你的应用中引入更多的全局状态.
更新 似乎有一些混乱,为什么这是一个麻烦.这造成的问题是它迫使我在整个应用程序中使用相同的工厂.如果我想在一个地方使用默认的SocketImpl而在另一个地方使用自定义的SocketImpl怎么办?如果不诉诸一些丑陋的反思黑客,就无法做到这一点,因为工厂一旦设置就无法改变.我也无法让我的工厂创建默认实现,因为SocksSocketImpl是包私有的.
当使用Socket类时,一个是在某个端口上与服务器建立TCP连接,但在服务器上,ServerSocket能够为每个接受请求处理多个客户端连接,并将其委托给一个线程来为请求提供服务.但是,如何使ServerSocket类在同一端口上接受多个tcp连接.
这是否意味着由操作系统来决定它允许的连接数或允许的最大积压数是多少,这可以由OS上的应用程序控制(我的意思是java受OS支持的最大积压限制)并且是TCP规范中的积压连接是否有任何特权?
最好的反对者,
Keshav
我有一个问题,我已经问过很多次了,但我想我现在离我们更近了一步,所以希望有人可以帮助我完成剩下的工作.
我以前的问题:
简单地说 - 我想创建一个应用程序:
第一部分相对容易,我已经做到了,但第二部分是令我不安的问题,以及我之前几次问过的问题.我想我已经取得了一些进展.
我想我需要ServerSocket在我的应用程序中使用a 以某种方式在NAS和播放内容的应用程序之间建立桥梁.我想这可以用a来完成Service.来自NAS设备的文件可以作为a访问FileInputStream.
市场上有很多应用程序(即ES文件资源管理器)能够在没有root访问权限的情况下执行此操作,所以我知道这是可能的 - 目前我还不知道如何.

我一直在使用一些上述应用程序时查看Logcat,它们似乎都在创建本地服务器,然后Intent从该服务器启动视频.怎么能实现这一目标?
我正在编译SDK 10(2.3.3):
android:minSdkVersion="10"
android:targetSdkVersion="16"
我正在测试两款索尼爱立信智能手机.其中一个有Android 2.3.7,另一个有4.0.1.
我listenUsingInsecureRfcommWithServiceRecord用来在蓝牙上打开一个新的服务器套接字并听取连接.
如果成功接受连接,那么一切正常.我甚至可以尝试取消服务器套接字,但这似乎并没有打扰刚刚创建的连接套接字.
但是当我想在线路bluetoothServerSocket.close();被执行后接受任何连接之前取消服务器套接字时,整个活动就会关闭并且进程终止.而且这不是我能处理的常规例外.
实际上即使logcat本身也退出!! 我必须再次快速执行它以获取您可以在下面看到的错误:
Zygote  D  Process 25471 terminated by signal (11)
  295         InputDispatcher  W  channel '2c2e20a8 com.pligor.test/activities.MainActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
  295         InputDispatcher  E  channel '2c2e20a8 com.pligor.test/activities.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
  295                dalvikvm  D  GC_FOR_ALLOC freed 1299K, 21% free 13252K/16583K, paused 93ms
  295         InputDispatcher  W  Attempted to unregister already unregistered input …我正在尝试ServerSocket在Android设备上使用端口进行侦听.我希望能够使用同一网络上的计算机通过WiFi连接到此端口.
将它绑定到端口时我没有异常,但是当我检查netstat时它说:
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 (null):4040             (null):*                LISTEN
我尝试了无数种方法将它绑定到localhost,0.0.0.0,设备的WiFi LAN IP地址用SocketInetAddress和InetAddress.getByName.似乎没什么用.
当我尝试从同一个WiFi中的计算机连接到端口时(我已尝试过netcat和Java Socket.connect()),我在Wireshark中看到的只是一个ARP请求:
Who has [phone's LAN address]? Tell [computer LAN address].
此请求会重复,直到超时.
我尝试了相反的方法,通过在计算机上设置ServerSocket并从手机连接到该端口,这非常有效.
我的测试手机是带有自定义ROM的三星Spica i5700.
有任何想法吗?
编辑:代码很简单,如下所示:
ServerSocket server = new ServerSocket();
server.setReuseAddr(true);
server.setTimeout(0);
server.bind(new InetSocketAddress(4040));
Socket client = null;
while((client = server.accept()) == null);
// Connected
enter code here
enter code here
我即将编程服务器,但我想知道我的想法是否可行.我的程序将输出到多个端口上的多个客户端 - 每个端口可以被多个客户端访问.
通常我会使用线程套接字服务器,但在这种情况下我需要它为多个端口工作.我想到的用法是在下面的模糊伪代码中:
xy希望这有点意义,你可以看到我正在尝试做什么.简单地说:听取选定的端口,根据连接的端口创建一个线程套接字连接.
这是可行的,还是我要结束多线程线程套接字服务器?
编辑:更改措辞以更好地反映问题.
我正在使用套接字运行一些测试,我遇到了一些奇怪的行为:ServerSocket将在第50个客户端Socket连接到它之后拒绝连接,即使该客户端套接字在下一个客户端套接字打开之前关闭,即使延迟是在连接之间添加.
以下程序是我的实验代码,它在当前状态下不会抛出任何异常并正常终止.但是,如果阵列大小Socket[] clients增加到50以上,则在第50次连接后尝试连接的任何客户端套接字都会被服务器套接字拒绝.
问题:为什么50是服务器套接字拒绝套接字连接的计数?
public static void main(String[] args) {
    try (ServerSocket server = new ServerSocket(2123)) {
        Socket[] clients = new Socket[50];
        for (int i = 0; i < clients.length; i++) {
            clients[i] = new Socket("localhost", 2123);
            System.out.printf("Client %2d: " + clients[i] + "%n", i);
            clients[i].close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
我已经运行了测试,其中另外50个套接字连接到另一个本地服务器,并且没有问题,100个套接字被打开和关闭,所以我推断它的服务器套接字是拒绝连接,而不是打开客户端套接字的一些限制,但我一直无法发现为什么服务器套接字限制为50个连接,即使它们没有同时连接.
我的应用程序连接到WiFi网络时运行网络服务时遇到问题.我得到以下异常,
java.net.SocketException: socket failed: ENONET (Machine is not on the network) 在下面的openPort()方法中
广播接收器
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
        NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
            welcomeService = new BroadcastService(context, "Welcome");
            Log.i(TAG, "onReceive: SUPPLICANT-STATE ---> Connected");
            //do something
            if (!serviceRegistered) {
                welcomeService.registerService();
                serviceRegistered = true;
            }
        }
        if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) {
            Log.i(TAG, "onReceive: SUPPLICANT-STATE ---> Disconnected");
            //do something
            unRegisterService();
        }
    }
}
public void unRegisterService() {
    if (serviceRegistered …我正在为自己构建一些内部工具,以使用我设置的一些模板以及可以在应用程序之间共享的一些附加功能来生成 Flutter 应用程序。
在代码编译、构建和部署的那一刻,它卡在第一个视图(空白屏幕)上,并在失败之前重试启动天文台服务器 11 次。除以下错误外,没有其他错误。
Launching lib\main.dart on Android SDK built for x86 in debug mode...
Built build\app\outputs\apk\debug\app-debug.apk.
I/flutter ( 7011): Observatory server failed to start after 1 tries
I/flutter ( 7011): Observatory server failed to start after 2 tries
I/flutter ( 7011): Observatory server failed to start after 3 tries
I/flutter ( 7011): Observatory server failed to start after 4 tries
I/flutter ( 7011): Observatory server failed to start after 5 tries
I/flutter ( 7011): Observatory server failed …我有一个服务器套接字程序,当我运行此程序时,我收到以下错误:
java.net.BindException: Address already in use
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
    at java.net.ServerSocket.bind(ServerSocket.java:328)
    at java.net.ServerSocket.<init>(ServerSocket.java:194)
    at Server.main(Server.java:20)
Could not listen on port: 5434.
postgres sql server已在此端口上运行,这解释了错误.我的硬件设备只将数据发送到此5434端口.
有什么方法可以解决这个错误?