gpt4 book ai didi

java - 用Java用Socket链接两台计算机

转载 作者:行者123 更新时间:2023-12-03 12:03:55 25 4
gpt4 key购买 nike

我有一个用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);
}
}

拜托,有人可以帮我吗?

最佳答案

使用服务器的本地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)

关于java - 用Java用Socket链接两台计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com