Java上的套接字连接,指定IP

时间:2013-12-25 21:42:08

标签: 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;
    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);  

我做得对吗?

感谢。

3 个答案:

答案 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#的例子,所以我不会打扰你,但你可以在谷歌上轻松找到例子。

例如。 http://www.kieser.net/linux/java_server.html