如何 运行 JAVA 中的服务器-客户端应用程序
How to run a server-client application in JAVA
我试图通过先 运行 聊天服务器文件然后聊天客户端文件来 运行 以下代码。
import java.net.*;
import java.io.*;
public class chatserver
{
public static void main(String args[]) throws Exception
{
ServerSocket ss=new ServerSocket(2000);
Socket sk=ss.accept();
BufferedReader cin=newBufferedReader(newInputStreamReader(sk.getInputStream()));
PrintStream cout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
s=cin.readLine();
if (s.equalsIgnoreCase("END"))
{
cout.println("BYE");
break;
}
System. out.print("Client : "+s+"\n");
System.out.print("Server : ");
s=stdin.readLine();
cout.println(s);
}
ss.close();
sk.close();
cin.close();
cout.close();
stdin.close();
}
}
public class chatclient
{
public static void main(String args[]) throws Exception
{
Socket sk=new Socket("192.168.0.19",2000);
BufferedReader sin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
PrintStream sout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
System.out.print("Client : ");
s=stdin.readLine();
sout.println(s);
s=sin.readLine();
System.out.print("Server : "+s+"\n");
if ( s.equalsIgnoreCase("BYE") )
break;
}
sk.close();
sin.close();
sout.close();
stdin.close();
}
}
但它不起作用。这种应用的正确procedure/steps到运行是什么?
运行 服务器文件出现以下错误。
Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:382)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at javaapplication1.chatserver.main(chatserver.java:19)
Java Result: 1
地址已被使用:JVM_Bind
Java 应用程序正在尝试连接端口 2000,但该端口已被其他进程使用,并且 JVM
绑定到该特定端口 2000 失败。现在要修复此错误,您需要找出哪个进程正在侦听端口 2000
Windows 用户:
- 在命令提示符中,发送命令"netstat -ao"。您可以获得所有进程的网络信息。
- 找出使用2000端口的那个,得到PID。
- 从 windows 任务管理器中找出具有您刚刚获得的 PID 的进程并将其关闭。 (默认情况下,任务管理器不显示 PID。您必须从菜单视图 | Select 列中添加它)
- 重启服务器。
- 重新启动您刚刚关闭的应用程序。
Unix 用户:
大多数 Unix 系统都有内置的 fuser 命令,returns 占用端口的进程:
fuser -v -n (tcp | udp) <port#>
但如果您无法终止该进程,则需要更改您的 Web 服务器配置或 Eclipse 配置以侦听不同的端口。在 tomcat 的情况下,您可以在 server.xml
的连接器部分更改它,在 eclipse 的情况下,您可以在此处看到为 Java 远程调试设置 Eclipse。
将您正在使用的端口号更改为运行您的应用程序。
有关更多信息,请查看此 link- http://www.mastertheboss.com/jboss-server/jboss-configuration/solving-javanetbindexception-address-already-in-use-jvmbind
您的端口 2000 已被另一个进程使用。
尝试在命令行上使用 netstat 命令查看正在使用的端口。
我通常使用 5 位端口,例如 10999,这并不常见。
您正在为客户端和服务器使用相同的端口:2000,这就是启动客户端失败的原因,因为只有一个进程可以使用套接字,所以如果服务器占用它,那么客户端就不能。
这是您的工作示例:
// 服务器
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public Server() {
// TODO Auto-generated constructor stub
}
public static void main(String args[]) throws Exception
{
System.out.println("Server started");
ServerSocket ss=new ServerSocket(8888);
System.out.println("Server waiting for connection");
Socket sk=ss.accept();
System.out.println("Server Connected");
BufferedReader cin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
PrintStream cout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
s=cin.readLine();
if (s.equalsIgnoreCase("END"))
{
cout.println("BYE");
break;
}
System. out.print("Client : "+s+"\n");
System.out.print("Server : ");
s=stdin.readLine();
cout.println(s);
}
ss.close();
sk.close();
cin.close();
cout.close();
stdin.close();
}
}
// 客户端
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class Client {
public Client() {
// TODO Auto-generated constructor stub
}
public static void main(String args[]) throws Exception
{
System.out.println("Client started");
Socket sk=new Socket("localhost",8888);
System.out.println("Client Connected");
BufferedReader sin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
PrintStream sout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
System.out.print("Client : ");
s=stdin.readLine();
sout.println(s);
s=sin.readLine();
System.out.print("Server : "+s+"\n");
if ( s.equalsIgnoreCase("BYE") )
break;
}
sk.close();
sin.close();
sout.close();
stdin.close();
}
}
Address already in use
表示某些程序已经在侦听端口 2000(很可能是您没有正确关闭的同一个程序)。
尝试不同的端口。
您可以在命令行中使用 netstat
命令查看当前正在使用的端口。
我试图通过先 运行 聊天服务器文件然后聊天客户端文件来 运行 以下代码。
import java.net.*;
import java.io.*;
public class chatserver
{
public static void main(String args[]) throws Exception
{
ServerSocket ss=new ServerSocket(2000);
Socket sk=ss.accept();
BufferedReader cin=newBufferedReader(newInputStreamReader(sk.getInputStream()));
PrintStream cout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
s=cin.readLine();
if (s.equalsIgnoreCase("END"))
{
cout.println("BYE");
break;
}
System. out.print("Client : "+s+"\n");
System.out.print("Server : ");
s=stdin.readLine();
cout.println(s);
}
ss.close();
sk.close();
cin.close();
cout.close();
stdin.close();
}
}
public class chatclient
{
public static void main(String args[]) throws Exception
{
Socket sk=new Socket("192.168.0.19",2000);
BufferedReader sin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
PrintStream sout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
System.out.print("Client : ");
s=stdin.readLine();
sout.println(s);
s=sin.readLine();
System.out.print("Server : "+s+"\n");
if ( s.equalsIgnoreCase("BYE") )
break;
}
sk.close();
sin.close();
sout.close();
stdin.close();
}
}
但它不起作用。这种应用的正确procedure/steps到运行是什么?
运行 服务器文件出现以下错误。
Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:382)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at javaapplication1.chatserver.main(chatserver.java:19)
Java Result: 1
地址已被使用:JVM_Bind
Java 应用程序正在尝试连接端口 2000,但该端口已被其他进程使用,并且 JVM
绑定到该特定端口 2000 失败。现在要修复此错误,您需要找出哪个进程正在侦听端口 2000
Windows 用户:
- 在命令提示符中,发送命令"netstat -ao"。您可以获得所有进程的网络信息。
- 找出使用2000端口的那个,得到PID。
- 从 windows 任务管理器中找出具有您刚刚获得的 PID 的进程并将其关闭。 (默认情况下,任务管理器不显示 PID。您必须从菜单视图 | Select 列中添加它)
- 重启服务器。
- 重新启动您刚刚关闭的应用程序。
Unix 用户:
大多数 Unix 系统都有内置的 fuser 命令,returns 占用端口的进程:
fuser -v -n (tcp | udp) <port#>
但如果您无法终止该进程,则需要更改您的 Web 服务器配置或 Eclipse 配置以侦听不同的端口。在 tomcat 的情况下,您可以在 server.xml
的连接器部分更改它,在 eclipse 的情况下,您可以在此处看到为 Java 远程调试设置 Eclipse。
将您正在使用的端口号更改为运行您的应用程序。 有关更多信息,请查看此 link- http://www.mastertheboss.com/jboss-server/jboss-configuration/solving-javanetbindexception-address-already-in-use-jvmbind
您的端口 2000 已被另一个进程使用。
尝试在命令行上使用 netstat 命令查看正在使用的端口。
我通常使用 5 位端口,例如 10999,这并不常见。
您正在为客户端和服务器使用相同的端口:2000,这就是启动客户端失败的原因,因为只有一个进程可以使用套接字,所以如果服务器占用它,那么客户端就不能。
这是您的工作示例:
// 服务器
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public Server() {
// TODO Auto-generated constructor stub
}
public static void main(String args[]) throws Exception
{
System.out.println("Server started");
ServerSocket ss=new ServerSocket(8888);
System.out.println("Server waiting for connection");
Socket sk=ss.accept();
System.out.println("Server Connected");
BufferedReader cin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
PrintStream cout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
s=cin.readLine();
if (s.equalsIgnoreCase("END"))
{
cout.println("BYE");
break;
}
System. out.print("Client : "+s+"\n");
System.out.print("Server : ");
s=stdin.readLine();
cout.println(s);
}
ss.close();
sk.close();
cin.close();
cout.close();
stdin.close();
}
}
// 客户端
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class Client {
public Client() {
// TODO Auto-generated constructor stub
}
public static void main(String args[]) throws Exception
{
System.out.println("Client started");
Socket sk=new Socket("localhost",8888);
System.out.println("Client Connected");
BufferedReader sin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
PrintStream sout=new PrintStream(sk.getOutputStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s;
while ( true )
{
System.out.print("Client : ");
s=stdin.readLine();
sout.println(s);
s=sin.readLine();
System.out.print("Server : "+s+"\n");
if ( s.equalsIgnoreCase("BYE") )
break;
}
sk.close();
sin.close();
sout.close();
stdin.close();
}
}
Address already in use
表示某些程序已经在侦听端口 2000(很可能是您没有正确关闭的同一个程序)。
尝试不同的端口。
您可以在命令行中使用 netstat
命令查看当前正在使用的端口。