我正在开发一个多个客户端需要与远程服务器交互的程序 我已在本地对其进行了测试,一切正常(稍后会详细介绍),但我无法理解如何设置远程IP。 我阅读了Socket的API以及InetAddress' API。这是正确的方法吗? Java如何处理IP?在localhost案例中不仅有简单的字符串,我是对的吗? 这是我的代码:
客户端:
public class Client {
final String HOST = "localhost";
final int PORT = 5000;
Socket sc;
DataOutputStream message;
DataInputStream istream;
public void initClient() {
try {
sc = new Socket(HOST, PORT);
message = new DataOutputStream(sc.getOutputStream());
message.writeUTF("test");
sc.close();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
服务器:
public class Server {
final int PORT = 5000;
ServerSocket sc;
Socket so;
DataOutputStream ostream;
String incomingMessage;
public void initServer() {
try {
sc = new ServerSocket(PORT);
} catch (IOException ex) {
System.out.println("Error: " + ex.getMessage());
}
BufferedReader input;
while(true){
try {
so = new Socket();
System.out.println("Waiting for clients...");
so = sc.accept();
System.out.println("A client has connected.");
input = new BufferedReader(new InputStreamReader(so.getInputStream()));
ostream = new DataOutputStream(so.getOutputStream());
System.out.println("Confirming connection...");
ostream.writeUTF("Successful connection.");
incomingMessage = input.readLine();
System.out.println(incomingMessage);
sc.close();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
}
另外,我在本地测试中遇到了一些麻烦 首先,有时我得到以下结果:
等待客户...
客户已连接。
确认连接...
错误:软件导致连接中止:recv失败
虽然有些时候它运作得很好。好吧,至少第一次连接。
最后一个问题:
当我尝试从服务器向客户端发送消息时,程序进入infite循环并需要手动关闭。我将此代码添加到代码中:
fromServerToClient = new BufferedReader(new InputStreamReader(sc.getInputStream()));
text = fromServerToClient.readLine();
System.out.println(text);
我做得对吗?
感谢。
答案 0 :(得分:1)
而不是使用
String host = "localhost";
你可以使用像
这样的东西String host = "www.ibm.com";
或
String host = "8.8.8.8";
答案 1 :(得分:0)
这就是您通常实现服务器的方式:
class DateServer {
public static void main(String[] args) throws java.io.IOException {
ServerSocket s = new ServerSocket(5000);
while (true) {
Socket incoming = s.accept();
PrintWriter toClient =
new PrintWriter(incoming.getOutputStream());
toClient.println(new Date());
toClient.flush();
incoming.close();
}
}
}
以下是As Client:
import java.util.Scanner;
import java.net.Socket;
class DateClient {
public static void main(String[] args) throws java.io.IOException
{
String host = args[0];
int port = Integer.parseInt(args[1]);
Socket server = new Socket(host, port);
Scanner scan = new Scanner( server.getInputStream() );
System.out.println(scan.nextLine());
}
}
答案 2 :(得分:0)
您应该考虑在线程中执行此操作。现在,多个用户无法一次连接到服务器。这意味着他们必须排队连接到服务器,导致性能非常差。
通常,您会收到客户端并实例化一个新线程来处理客户端请求。我只有C#的例子,所以我不会打扰你,但你可以在谷歌上轻松找到例子。