1

我有两个 java 应用程序,一个是 web 应用程序,另一个是简单的 java 应用程序,所以我使用 Socket 编程进行它们之间的通信。

我创建了一个 SocketServer,它是一个线程,我在其中创建ServerSocket serverSocket = new ServerSocket(6789) 并在我的 Web 应用程序中创建了Socket client = new Socket("localhost", 6789); 我的服务器向客户端发送一些数据,客户端将开始一些其他工作,但是如果我想运行另一个客户端,即服务器将发送不同的参数和客户必须开始处理我该怎么办?

因为服务器已经在“6789”端口上启动,第一个客户端也使用相同的端口。如何使用另一个端口启动客户端?

每次服务器都必须先启动,然后再启动客户端。

我认为客户端将无法找到服务器,直到两者都具有相同的端口。

我是否必须创建另一个具有不同端口的服务器实例,然后调用客户端???但是我的客户怎么知道是在哪个端口服务器上启动的呢?

例如:

想象一下我有这样的用户界面:

启动 MIlind

开始 xyz

开始 abc

然后点击 strart 它将调用客户端并启动进程,如果先启动 Milind 那么我将如何启动 xyz?因为“启动 Milind”在端口 6789 启动客户端和服务器,其他启动过程将如何工作?

4

2 回答 2

4

仅为 Web 应用程序与本地 Java 程序通信而创建服务器/客户端应用程序似乎有很多开销(甚至更多地复制此过程以一次做不止一件事)。如果您在 Web 应用程序的后台寻找并发处理,您总是可以只创建一个线程(或多个线程)来完成工作。还是有一个简单的java应用程序不能嵌入到网络应用程序中的原因?

于 2012-10-03T12:59:51.070 回答
2

在接受套接字连接服务器端时,您需要分离线程。使用 serversocket 很容易做到这一点。一个非常基本(未经测试!)的实现:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

class Server {

    private ServerSocket socket;

    public Server() {
        try {
            this.socket = new ServerSocket(6789);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void go() throws IOException {
        while(true) {
            Socket sock = socket.accept();
            new Thread(new ClientSession(sock)).start();
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        try {
            server.go();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    class ClientSession implements Runnable {

        private final Socket clientsocket;

        ClientSession(Socket sock) {
            this.clientsocket = sock;
        }

        @Override
        public void run() {
            //do stuff, like read from socket.
        }

    }

}

请注意,您根本不需要更改端口。

于 2012-10-03T13:07:33.070 回答