TcpSockets无法连接

时间:2014-09-01 17:38:52

标签: java sockets network-programming network-protocols

我正在尝试在作为客户端的笔记本电脑和作为服务器的PC之间建立TCP连接。 我的目标是使用服务器在两个Android设备之间发送消息。服务器具有公共IP地址。为了测试连接,我编写了两个简单的Java类:

import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {    
    public ServerSocket welcome;
    public Socket soc;
    public int listeningPort = /* default port */;

    public TcpServer() {
    }

    public static void main(String[] args) {
        TcpServer ms = new TcpServer();
        if(args.length > 0) {
            ms.listeningPort = Integer.parseInt(args[0]);
        }
        ms.listen();
    }

    public void listen() {
        try {
            welcome = new ServerSocket(listeningPort);
            System.out.println(">>> listening on port " + listeningPort + " <<<");

            soc = welcome.accept();
            System.out.println(">>> got a new connection from "
                    + soc.getInetAddress().toString() + " <<<");

            while (true) {
                try {
                    byte b[] = new byte[1024];
                    soc.getInputStream().read(b, 0, 1);
                    System.out.print((char) (b[0]));
                } catch (Exception e) {
                    System.err.println(e);
                }
            }

        } catch (Exception e) {
            System.err.println(e);
        }       
    }
}

import java.net.Socket;

public class TcpSendClient {    
    private String serverIp = /* some ip */;
    public int port = /* default port */;
    private SendThread st;

    public TcpSendClient() {
    }

    public static void main(String[] args) {
        TcpSendClient client = new TcpSendClient();
        if(args.length > 0) {
            client.port = Integer.parseInt(args[0]);
        }
        client.send();
    }

    public void send() {
        System.out.println("Try to connet to " + serverIp + " via Port" + port);
        st = new SendThread(serverIp, port);
        st.start();
    }

    class SendThread extends Thread {
        private Socket soc;

        public SendThread(String theIp, int thePort) {
            try {
                soc = new Socket(theIp, thePort);
            } catch (Exception e) {
                System.err.println(e);          
            }
        }

        public void run() {
            try {
                while (true) {
                    String toSend = "Hello ";
                    soc.getOutputStream().write(toSend.getBytes());
                    Thread.sleep(800);
                    System.out.println("sent");
                }
            } catch (Exception e) {
                System.err.println(e);          
            } 
        }
    }
}

当我在服务器pc上运行两个Java文件时,连接正常。如果我用一台笔记本电脑设置本地Wi-Fi并使用另一台笔记本电脑连接到它,它也可以工作。 但是,当我从连接到互联网的笔记本电脑运行客户端文件时,我无法获得连接。 在服务器的防火墙上,我打开了许多用于连接的端口,而我用作客户端的笔记本电脑已禁用防火墙。 除了防火墙之外,我真的不知道要查看什么才能使连接运行。关于我的问题的原因和解决方案的任何想法?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:Windows防火墙仍在阻止Java端口。我花了一点时间来弄明白这一点,因为我没有在该电脑上注册为管理员而且看不到规则。