我有两个java应用程序,一个是web应用程序,另一个是简单的java应用程序,所以我使用Socket编程进行通信。
我创建了一个SocketServer,它是一个Thread,我创建了ServerSocket serverSocket = new ServerSocket(6789)
在我的网络应用中,我创建了Socket client = new Socket("localhost", 6789);
我的服务器向客户端发送一些数据,客户端将启动其他工作,但如果我想运行另一个客户端,即服务器将发送不同的参数,客户端必须开始处理我应该做什么?
因为服务器已在'6789'端口启动,而第一个客户端也使用相同的端口启动。如何使用其他端口启动客户端?
每次服务器必须首先启动,然后是客户端。
我认为客户端不会找到服务器,直到它们都有相同的端口。
我是否必须使用不同的端口创建另一个服务器实例然后调用客户端???但是我的客户端如何知道哪个端口服务器已启动?
例如:
想象一下我有以下UI:
启动MIlind
启动xyz
启动abc
然后单击strart它将调用客户端并启动进程,如果先启动Milind然后我将如何启动xyz? 因为'启动Milind'在6789端口启动了客户端和服务器,其他启动流程将如何工作?
答案 0 :(得分:4)
创建服务器/客户端应用程序只是为了让Web应用程序与本地java程序进行通信似乎需要很多开销(更重要的是复制此进程以一次执行多个操作)。如果您正在Web应用程序的后台寻找并发处理,您始终可以创建一个线程(或多个线程)来完成工作。或者有没有理由说明简单的Java应用程序无法嵌入到Web应用程序中?
答案 1 :(得分: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.
}
}
}
请注意,您根本不需要更改端口。