我有以下情况。
我有一个Server类。 我有一个Client类。 我有一个MultiServerThread类。
当客户端连接到服务器时,服务器会创建一个新的MultiServerThread,它正在处理来自客户端的输入。这样我可以拥有多个客户端。到现在为止还挺好。 连接通过TCP进行。
一个简短的例子:
服务器类:
...
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket = new ServerSocket(9999);
} catch (IOException e) {
System.err.println("Could not listen on port: " + serverSocket.getLocalPort() + ".");
System.exit(-1);
}
while (listening) {
new MultiServerThread(serverSocket.accept()).start();
}
serverSocket.close();
}
...
客户类:
...
public static void main(String[] args) throws IOException {
socket = new Socket(hostname, port);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
while ((fromServer = in.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye.")) {
break;
}
fromUser = stdIn.readLine();
if (fromUser != null) {
System.out.println("Client: " + fromUser);
out.println(fromUser);
}
}
out.close();
in.close();
stdIn.close();
socket.close();
}
...
MultiServerThread类:
...
public MultiServerThread(Socket socket) throws SocketException {
super("MultiServerThread");
this.socket = socket;
// dSocket = new DatagramSocket(4445);
}
public void run() {
try {
PrintWriter myOutput = new PrintWriter(socket.getOutputStream(), true);
BufferedReader myInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
myOutput.println("Connected to client and ready to accept commands.");
while ((clientInput = myInput.readLine()) != null) {
//A SIMPLE LOGIN A USER
if (clientInput.contains("!login")) {
//save some string given by client into loggedUser
String loggedUser = clientInput.substring(7);
}
myOutput.close();
myInput.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我需要的是:
我需要实现来自服务器的通知,例如用户名是“Bob”。如果用户名是“Bob”,则服务器应该向客户端发出通知“Bob再次来到这里!”。在我的项目/作业中,这应该用Java中的数据报来完成。
因此,如果clientinput是“!login bob”,那么应该将带有消息的数据报包(“Bob再次来到这里!”)发送给客户端。
问题:我应该在何处放入数据报请求的代码?我可以将数据报包请求放入MultiServerThread或客户端吗?
在MultiServerThread中会更容易,因为它已经处理了!login。 在这里:
if (clientInput.contains("!login")) {
//save some string given by client into loggedUser
String loggedUser = clientInput.substring(7);
//send datagram request to Server???
}
但这违背了网络原则?
答案 0 :(得分:0)
您需要通过初始TCP连接将UDP端口号发送到您的客户端。然后,您开始在该端口号上侦听客户端上的UDP数据报。来自服务器的所有其他通信 - >客户端将在这个udp套接字上。这就是你的作业建议
答案 1 :(得分:0)
我得到了它的工作; - )
我在线程和客户端类中定义了一个udp端口... 客户端类获得了带有参数的端口......它将udp端口提供给线程...所以两者都有udp端口;)