您好我是Java套接字的新手,我一直在尝试创建服务器套接字。有人可以告诉我哪里出错了,因为我收到错误说"地址已经在使用"。有时我没有收到错误,但它只是没有形成连接。请帮忙?这是服务器类和客户端类。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
public class MessageServer {
public static void main(String[] args) throws IOException{
int port = 8080;
//int port = Integer.parseInt(args[0]);
ServerSocket server = new ServerSocket(port);
while(true){
System.out.println("Waiting for client...");
Socket client = server.accept();
System.out.println("Client from " + client.getInetAddress() + " connected.");
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String inputLine = in.readLine();
System.out.println("Client said: '"+inputLine+"'");
Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
byte c [] = count.toString().getBytes();
count.flush();
}
}
}
import java.net.*;
import java.io.*;
public class MessageSendClient {
public static void man(String args[]) throws IOException{
Socket server1 = new Socket("143.210.72.82", 8080);
System.out.println("Connected to " + server1.getInetAddress());
InputStream in = server1.getInputStream();
byte c[] = new byte[100];
int num = in.read(c);
String count = new String(c);
System.out.println("Server said: " + count);
}
}
答案 0 :(得分:0)
不要使用你的ip,而是使用localhost或127.0.0.1 并尝试新的端口,尝试使用大于1024的端口(大多数在这个数字下是众所周知的端口,他们注册到IANA)
答案 1 :(得分:0)
尝试新端口。我不会使用8080,因为它可能(并且可能已经使用过)。使用后也要尽量关闭套接字。
由于我自己使用套接字用于大学目的,这里是代码(如果你需要UDP或RMI,我也可以发布它们)
public class TCPClient {
public static void main(String[] args){
try{
Socket socket = new Socket("127.0.0.1", 6666);
PrintWriter data_to_server = new PrintWriter(socket.getOutputStream(), true);
BufferedReader data_from_server =
new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//Schicke Nachricht an Server
BufferedReader system_reader = new BufferedReader(new InputStreamReader(System.in));
long start_send = System.nanoTime();
String msg = system_reader.readLine();
data_to_server.println(msg);
//Erhalte jeweilige Antwort
msg = data_from_server.readLine();
System.out.println("Data from Server : " + msg);
System.out.println("Timespan: " + (System.nanoTime()-start_send));
socket.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
TCPServer tcp = new TCPServer();
tcp.initialize(6666);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public void initialize(int port) throws IOException {
// Erstellen eines Server Sockets
ServerSocket server = new ServerSocket(port);
while (true) {
// Warten bis die Verbindung besteht
System.out.println("Waiting for client to connect...");
Socket socket = server.accept();
// Writer für die ausgehende Antwort
PrintWriter data_to_client = new PrintWriter(
socket.getOutputStream(), true);
// Reader für die ankommende Nachricht
BufferedReader data_from_client = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// IP-Adresse des Clients
InetAddress remoteIp = socket.getInetAddress();
// Erhalten der Nachricht
String msg = data_from_client.readLine();
System.out.println("Client " + remoteIp + " : " + msg);
// Versenden der Antwort
send(data_to_client, msg);
}
}
}
答案 2 :(得分:0)
如果你在Linux 8080/80/8443中没有好的端口我们像3456这样的其他端口。 并始终从您的客户端关闭您的套接字。
更新: 首先,您不应该使用Server.close()关闭Server套接字,Server应该正在运行。这就是为什么while循环在那里。您应该从服务器获取输入流后,使用socket.close()关闭客户端套接字。还要记住在write()和flush()之后始终使用Close()关闭输出流以避免副作用。制作两个类,一个用于服务器,一个用于客户端。首先启动Java类Server,然后运行Client类以连接到Server。终止您的Client类并再次运行它。如果您使用的是eclipse,也可以在控制台中终止客户端。有时Java进程是重叠的,所以只需用x按钮终止所有正在运行的进程。完善示例代码后,可以再次启动Server和Client类。 如果仍然无法正常工作,则需要再次重新发布问题,并在客户端和服务器的详细信息中显示当前代码。不知怎的,我已经失去了赛道,你现在的状态在哪里,因为你已经批准了你的问题的答案。