Java上的套接字连接,指定IP
我正在开发一个程序,其中多个客户端需要与远程服务器交互。Java上的套接字连接,指定IP,java,sockets,ip,client-server,client,Java,Sockets,Ip,Client Server,Client,我正在开发一个程序,其中多个客户端需要与远程服务器交互。 我已经在本地对它进行了测试,一切正常(稍后会详细介绍),但我不知道如何设置远程IP。 我阅读了Socket的API和InetAddress的API。这样做对吗?Java如何处理IP?不像localhost案例中那样只有简单的字符串,对吗? 这是我的代码: 客户: public class Client { final String HOST = "localhost"; final int PORT = 5000;
我已经在本地对它进行了测试,一切正常(稍后会详细介绍),但我不知道如何设置远程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);
我做得对吗
谢谢。这是您通常实现服务器的方式:
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();
}
}
}
以下将作为客户:
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());
}
}
而不是使用
String host = "localhost";
你可以用像
String host = "www.ibm.com";
或
你应该考虑用线程来做这件事。目前,多个用户无法同时连接到服务器。这意味着他们必须排队等待与服务器的连接,从而导致性能非常差 通常,您会收到客户机并实例化一个新线程来处理客户机请求。我只有C语言的例子,所以我不会打扰你,但是你可以很容易地在谷歌上找到例子 例如。
我知道我应该在线程中执行此操作。但我还没到那里,我想先让它只为一个客户工作。我的问题是IP配置。你提供的链接没有提供这方面的信息。如果我有一个代表我的IP的名字,这就行了。是否可以使用XXX.XXX.XXX.XXX格式简单地将其设置为数字?@jalbano您的意思是像上一个示例一样吗?是的,我尝试过,但它不适用于大于127的数字(字节限制)。我的意思是,用“127.0.0.1”可以,但我不能用一些朋友的IP(比如“123.456.789.101”)来代替这个数字。我认为将IP作为字符串处理是错误的,对吗?@jalbano不,你可以使用“254.254.254.254”。问题不在于地址,而在于你朋友的IP是否在防火墙后面。防火墙是专门为阻止未被允许的流量而设计的,很可能是你的流量也不被允许。所以它不仅仅是打开路由器端口?好的,我查一下。谢谢。我看到您正在为主机使用字符串类型变量。但是,如果我的IP没有名字,我该怎么做呢?我想有些东西我不明白。我不能只写“123.456.789.101”,它不起作用。我只是试着用代码从服务器向客户端发送消息。它很管用,谢谢!从现在起我就要用它了。我明白你的困惑。请用我对这个问题的回答作为建议:。。如果你认为我的答案对你有帮助,请不要忘记接受它作为一个答案。我在你的答案中发现了这个。这与我测试程序时所做的相同:s=新套接字(“127.0.0.1”,端口);我不明白的是如何制作这个遥控器,我的意思是,下面的行是错误的:s=新插座(“123.456.789.101”,端口);如何将远程IP设置到客户端?我感谢你的帮助!
String host = "8.8.8.8";