我试图通过编写Java程序(边做边学)来理解网络的主题。我使用java.net.Socket在Java中编写了客户端和服务器。客户端是一类,服务器是一类。然后,我在一个Main-class中实例化了这两个类。Java应用程序在我的计算机上运行。当我为客户端和服务器分配相同的端口时,我没有收到任何错误(例如:端口80)。但是,当我分配不同的端口(例如:服务器的端口80和客户端的端口9090)时,出现错误。我应该使用相同的端口进行tcp连接吗?我想了解为什么会出错。这是我的整个代码放在一个Java包中:
package client_server;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.*;
import java.util.Date;
public class Server {
ServerSocket server;
Server(){
System.out.println("server starts");
try{
//server runs on port 9090
server=new ServerSocket(9090);
}catch(IOException e){
e.printStackTrace();
}
}
void listen(){
Socket socket = null;
try {
System.out.println("server is listining");
socket=server.accept();
PrintWriter out =new PrintWriter(socket.getOutputStream(), true);
out.println(new Date().toString());
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package client_server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.*;
public class Client {
Socket clientSocket;
Client(){
System.out.println("Client starts");
final String server_ip_adress="127.0.0.1";
try {
clientSocket = new Socket(server_ip_adress,80);
} catch (IOException e) {
e.printStackTrace();
}
}
void connectToServer(){
try{
System.out.println("client connects to server");
InputStream clientInput=clientSocket.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(clientInput));
String answer = input.readLine();
System.out.println(answer);
}catch(IOException e){
e.printStackTrace();
}
}
}
package client_server;
public class Main {
public static void main(String [] args){
Server server = new Server();
Client client = new Client();
server.listen();
client. connectToServer();
}
}
从理论上讲,它应该起作用,因为将为每个进程(服务器进程和客户端进程)分配一个端口,并且进程间通信是否发生在不同的端口上无关紧要。
但就我而言,我只有一个过程。因此,当我分配不同的端口时,会引发错误。我的分析正确吗?我收到此错误:地址已在使用中:JVM_Bind
服务器侦听端口9090,因此客户端必须连接到端口9090。但是并非为客户端分配了9090端口。实际上,当您netstat
在连接客户端后运行时,您会看到客户端是使用系统分配的另一个端口。
注意,当您打印“客户端连接到服务器”时,客户端已经连接(new Socket(...)
返回时)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句