使用Java中的Socket链接两台计算机

时间:2017-03-30 15:20:43

标签: java sockets server client connect

我有一个Java服务器和客户端,都在localhost或我的机器IP上工作,但是当我从本地网络中的另一台计算机告诉IP时,它告诉“发生异常:连接被拒绝:连接”!这是我的代码:

ChatClient.java

package programmingchat;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ChatClient {

    private Socket socket;
    private Scanner console;
    private DataOutputStream output;
    private BufferedReader reader;

    public ChatClient(String serverName, int serverPort) {
        try {
            System.out.println("LiveChat Client 1.1 start.");
            System.out.println("Trying to connect to " + serverName + " on port " + serverPort + "...");
            socket = new Socket(serverName, serverPort);
            System.out.println("Success!");

            console = new Scanner(System.in);
            output = new DataOutputStream(socket.getOutputStream());
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            Thread t1 = new Thread(){
                @Override
                public void run() {
                    String line = "";

                    while(!line.equals(".bye")) {
                        try {
                            System.out.print("me: ");
                            line = console.nextLine();
                            output.writeUTF(line);
                            output.flush();
                        } catch(IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };

            Thread t2 = new Thread(){
                @Override
                public void run() {
                    String line = "";

                    try {
                        while(!(line = reader.readLine()).equals(".bye")) {
                            System.out.print("\nhe: " + line + "\nme: ");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            t1.start();
            t2.start();
        } catch(UnknownHostException e) {
            System.err.println("Unknown host: " + e.getMessage());
        } catch(IOException e) {
            System.err.println("Exception ocurred: " + e.getMessage());
        } catch(Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

    @SuppressWarnings({ "unused", "resource" })
    public static void main(String[] args) throws IOException {
        File hostsFile = new File("hosts.dat");

        if(!hostsFile.exists()) {
            hostsFile.createNewFile();
            FileController.writeFile(hostsFile.getPath(), "localhost\n");
        }

        String hosts = FileController.loadFile("hosts.dat");
        String[] h = hosts.split("\n");

        System.out.println("Select host by it number, or insert a new one.");
        System.out.println("Currently avaliable hosts: ");

        for(int i = 0; i < h.length; i++) {
            System.out.println(i + ": " + h[i]);
        }

        System.out.print("Please provide the IP Address of the server: ");
        Scanner s = new Scanner(System.in);
        String hostName = s.nextLine();

        if(isInteger(hostName)) {
            int i = Integer.parseInt(hostName);
            hostName = h[i];
        } else {
            FileController.writeFile(hostsFile.getPath(), hostName + "\n");
        }

        ChatClient client = new ChatClient("localhost", 9081);
    }

    private static boolean isInteger(String str) {
        boolean is = false;

        try {
            Integer.parseInt(str);
            is = true;
        } catch(Exception e) {
            is = false;
        }

        return is;
    }
}

ChatServer.java

package programmingchat;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {

    private Socket[] sockets;
    private ServerSocket server;
    private DataInputStream[] ins;
    private PrintStream[] outs;

    private String ln1;
    private String ln2;

    public ChatServer(int port) {
        try {
            System.out.println("LiveChat Server 0.9 start.");
            System.out.println("Trying to open port " + port + "...");
            server = new ServerSocket(port);
            System.out.println("Server " + server.getInetAddress().getHostName() + " successfully started!");
            System.out.println("Instantiating input and output streams...");
            ins = new DataInputStream[2];
            outs = new PrintStream[2];
            System.out.println("Success!");
            System.out.println("Instantiating sockets...");
            sockets = new Socket[2];
            System.out.println("Success!");
            System.out.println("Waiting socket 1 to connect...");
            sockets[0] = server.accept();
            System.out.println("Success!");
            System.out.println("Waiting socket 2 to connect...");
            sockets[1] = server.accept();
            System.out.println("Success!");
            System.out.println("Opening input and output streams...");
            open();
            System.out.println("Success!");
            System.out.println("Initializing input strings...");
            ln1 = "";
            ln2 = "";
            System.out.println("Success!");

            Thread r1 = new Thread() {
                @Override
                public void run() {
                    try {
                        while(!ln1.equals(".bye")) {
                            ln1 = ins[0].readUTF();
                            System.out.println("1: " +ln1);
                            outs[1].println(ln1);
                        }

                        System.out.println("Socket 1 disconnect!");
                        sockets[0].close();
                    } catch(IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            Thread r2 = new Thread() {
                @Override
                public void run() {
                    try {
                        while(!ln2.equals(".bye")) {
                            ln2 = ins[1].readUTF();
                            System.out.println("2: " + ln2);
                            outs[0].println(ln2);
                        }

                        System.out.println("Socket 2 disconnect!");
                        sockets[1].close();
                    } catch(IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            r1.start();
            r2.start();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void open() throws IOException {
        ins[0] = new DataInputStream(new BufferedInputStream(sockets[0].getInputStream()));
        ins[1] = new DataInputStream(new BufferedInputStream(sockets[1].getInputStream()));
        outs[0] = new PrintStream(sockets[0].getOutputStream());
        outs[1] = new PrintStream(sockets[1].getOutputStream());
    }

    @SuppressWarnings("unused")
    public static void main(String[] args) {
        ChatServer chat = new ChatServer(9081);
    }
}

请有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

使用服务器的本地IP地址而不是“localhost”

ChatClient client = new ChatClient("localhost", 9081);

您的服务器位于不同的计算机上,如果服务器和客户端都在一台计算机上,则它可以正常工作。

How do I find my local (internal) IP address?

修改

通过在路由器上转发端口号,未配置路由器接受客户端和服务器之间的此连接肯定会导致此错误,因此您应该这样做。

How to Set Up Port Forwarding on a Router,根据路由器类型的不同而不同)

You could check also this video