0 0

Socket编程java.net.BindException: Address already in use: JVM_Bind5

本人最近想学Socket编程:无奈遇到个问题.不知道是啥原因,还请各位不吝赐教.
问题是这样的:我想用Socket在服务端读取文本文件,第一次运行的时候,什么都没数出来,(不停止第一次开启的服务)第二次输出了文本内容,却报了个地址被占用的错.这是为什么呢?
Socket客户端:
package socket;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;

public class socketClient {
private String ip;
public socketClient() {
// TODO Auto-generated constructor stub
}
public socketClient(String ip){
this.ip=ip;
}
public void client(){
PrintWriter print=null;
BufferedReader read=null;
File file=null;
try {
Socket ket=new Socket(ip,9000);//与服务器取得链接.
file=new File("e:\\我的地址.txt");
read=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String readLine=null;
print=new PrintWriter(ket.getOutputStream(),true);
while((readLine=read.readLine())!=null){
print.print(readLine);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
read.close();
print.close();

} catch (IOException e) {
e.printStackTrace();
}


}
}



}

Socket服务器:
package socket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class SocketRemot {
    private Map map=new HashMap();
public void reMoteRun(){
BufferedReader read=null;
PrintWriter write=null;
try {
while(true){
ServerSocket soc=new ServerSocket(9000);//为服务器Socket指定端口
Socket socket=soc.accept();//服务器端阻塞,一直等待客户端来访问.
map.put(socket.getPort()+"",socket);
System.out.println("我在等待.......");
//读取客户端文件.
//得到socket读取文件的流//字节流
/*
* InputStream是用于读取二进制文件的流,而服务器端读取的文件很有可能是文本形式的.所以要转换为字符流
* 字节流和字符流之间的转换通过InputStreamReader,和OutputStreamWrite来转换.
*/
read=new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取读文件的字符流
write=new PrintWriter(socket.getOutputStream(),true);//通过现有的output流来创建新的printWrite流
System.out.println(read.readLine());
// String str=null;
// while((str=read.readLine())!=null){
// System.out.println(read.readLine());//边读边写.
// }
// write.close();
// read.close();
// socket.close();

}


} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(read!=null){
read.close();
}
if(write!=null){
write.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

public void closeSocket(){
Iterator tor=map.values().iterator();
while(tor.hasNext()){
Socket soc=(Socket)tor.next();
if(!soc.isClosed()){
try {
soc.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

}

Test:
package socket;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Test {
public static void main(String[] args) {
SocketRemot remot=new SocketRemot();
socketClient ket=new socketClient(getAddIp());
remot.reMoteRun();
ket.client();
remot.closeSocket();

}

public static String getAddIp(){
   String serverIp=null;
      try {
   serverIp = InetAddress.getLocalHost().toString();
   serverIp = serverIp.substring(serverIp.indexOf("/")+1);
   System.out.println(serverIp);
   } catch (UnknownHostException e) {
   e.printStackTrace();
   }
   return serverIp;
   }
}

error:
java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source)
at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at socket.SocketRemot.reMoteRun(SocketRemot.java:25)
at socket.Test.main(Test.java:10)

问题补充:第一次的时候端口没有被占用,为什么内容没有数出来呢。第二次端口占用了,内容却数出来了。这是为什么呢?

问题补充:加上1.print.flush() 
貌似还是这样滴。

问题补充:
AngelAndAngel 写道
引用
,(不停止第一次开启的服务)第二次输出了文本内容,却报了个地址被占用的错.这是为什么呢?

你启动第一个,就占用了你的端口,然后再启动,又用了这个端口,所以会错了啊。

就比如你用tomcat的时候,你启动一次,第二次启动,就报你jvm 8080重复的错误是吧。不懂的站内问我吧。


      问题是:第一次启动的时候也没输出文本内容啊。

问题补充:
Rainbow702 写道
你在
引用
while((readLine=read.readLine())!=null){
print.print(readLine);
}
的while处打个断点,然后debug一下,看看第一次到底有没有执行到这个地方

       

      设了断点:
    Socket socket=soc.accept();//服务器端阻塞,一直等待客户端来访问.
运行到这一句就没了下文。是不是Socket服务端压根就没检测到有客户端在访问啊?到底是哪有问题呢。
2011年8月29日 10:06

9个答案 按时间排序 按投票排序

0 0

采纳的答案

引用
,(不停止第一次开启的服务)第二次输出了文本内容,却报了个地址被占用的错.这是为什么呢?

你启动第一个,就占用了你的端口,然后再启动,又用了这个端口,所以会错了啊。

就比如你用tomcat的时候,你启动一次,第二次启动,就报你jvm 8080重复的错误是吧。不懂的站内问我吧。

2011年8月29日 10:22
0 0

引用
public static void main(String[] args) {
SocketRemot remot=new SocketRemot();
socketClient ket=new socketClient(getAddIp());
remot.reMoteRun();
ket.client();
remot.closeSocket();

}


问题就在这了。这样写是不行的。解决有两个:
① 起两个线程分别启动 SocketRemot 和 socketClient
② 新建两个工程,把 SocketRemot 和 socketClient 放在不同的工程中启动(SocketRemot 要先启动)
这样就应该可以了

2011年8月29日 11:08
0 0

引用
运行到这一句就没了下文。是不是Socket服务端压根就没检测到有客户端在访问啊?到底是哪有问题呢。

我刚才说了哦,你先启动服务器端,然后再启动客户端。

2011年8月29日 11:01
0 0

引用
public static void main(String[] args) {
SocketRemot remot=new SocketRemot();
socketClient ket=new socketClient(getAddIp());
remot.reMoteRun();
ket.client();
remot.closeSocket();

}

你不这样弄啊,你用两个工程分别启动啊,别一起启动啊。你先启动你的服务器SocketRemot,然后在另外的工程,编写client,并且启动。

2011年8月29日 10:42
0 0

你在

引用
while((readLine=read.readLine())!=null){
print.print(readLine);
}
的while处打个断点,然后debug一下,看看第一次到底有没有执行到这个地方

2011年8月29日 10:41
0 0

引用
第一次的时候端口没有被占用,为什么内容没有数出来呢。第二次端口占用了,内容却数出来了。这是为什么呢?

这是因为你没有调用 flush()。在你的
引用
while((readLine=read.readLine())!=null){
print.print(readLine);
}

这个 while() 外面加上
print.flush()
试试

2011年8月29日 10:24
0 0

SocketRemot remot=new SocketRemot();
socketClient ket=new socketClient(getAddIp());


你怎把服务和客户端放到同一个main方法里

2011年8月29日 10:22
0 0

不停止第一次开启的服务,那么9000端口一直被占用了,后续再启动一个还想使用这个端口当然不行了

2011年8月29日 10:14
0 0

因为你第一次启动的时候,一个socket已经使用了这个端口,而且没有被正常关闭,所以,在你再次启动的时候,它当然就 in use 了啊

2011年8月29日 10:13

相关推荐

    解决jvmjava.net.BindException: Address already in use: JVM_Bind异常

    在Java编程中,当你尝试启动一个服务器端应用,如Tomcat,或者任何需要监听特定端口的服务时,可能会遇到`java.net.BindException: Address already in use: JVM_Bind`的异常。这个异常意味着你试图绑定的网络地址和...

    java.net.BindException: Address already in use: JVM_Bind :8088(端口冲突)

    在myeclipse中将html文件改成jsp文件时myeclipse卡住;将之前的任务关掉;再打开时多次部署项目的时候报错

    Android 中出现java.net.BindException: bind failed: EADDRINUSE 问题解决办法

    在Android开发过程中,网络通信是应用的重要组成部分,而使用UDP(User Datagram Protocol)进行数据传输时,可能会遇到`java.net.BindException: bind failed: EADDRINUSE`的问题。这个异常通常意味着应用程序尝试...

    启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    nested exception is: java.net.BindException: Address already in use: JVM_Bind  这里说的是1099端口被其它进程占用了. 二.解决办法  找出占用1099端口的进程,进入windows命令,查看什么进程占用了1099端口...

    解除Windows系统对JMeter压测工具连接数限制

    使用JMeter压测时,报java.net.bindexception:address already is use:connect异常,可执行本资源的.bat文件,修改系统注册表。

    Bug:Address already in use: JVM_Bind问题之总结

    在编程和系统开发过程中,我们可能会遇到一个常见的错误——"Address already in use: JVM_Bind"。这个错误通常发生在尝试绑定一个已经被占用的网络端口时。本文将深入探讨这个问题,提供解决方案,并从源码角度解析...

    jemeter压测数据库

    jemeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。 jemeter 可对服务器、网络或对象...

    Java Socket常见异常处理

    1. **java.net.BindException: Address already in use: JVM_Bind** 这个异常表明尝试绑定的端口已被其他服务占用。解决方法是检查并更改端口号,选择一个未被使用的端口。使用`netstat -an`命令可以帮助识别哪些...

    Java Netty异常分析BindException.pdf

    在开发基于Java Netty的应用程序时,可能会遇到`java.net.BindException: Address already in use: no further information`这类错误。本篇文章将详细解析这一异常的原因、可能的影响以及如何有效地解决该问题。 ##...

    Socket长连接异常处理

    java.net.BindException: Address already in use 该异常发生在服务器端进行 new ServerSocket(port) 操作时,原因是因为与 port 相同的端口已经被占用,解决方法是找到一个空闲的端口。 java.net....

    卸载工具007

    "卸载工具007"是一款专为用户设计的高效、便捷的软件卸载应用程序,旨在帮助用户彻底、干净地从计算机中移除不需要的软件。"完美"这个描述可能是指该工具在卸载过程中能确保不留任何残留,提供一种无瑕疵的卸载体验...

    一般异常问题

    端口冲突java.net.BindException: Address already in use: JVM_Bind java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory deploy(部署)项目。点击 deploy 按钮,在弹出的Project Deployments...

    activemq服务无法正常启动.docx

    Reason: java.io.IOException: Transport Connector could not be registered in JMX: Failed to bind to server socket: tcp://0.0.0.0:61616 due to java.net.BindException: Address already in use: JVM_Bind”...

    javaerror处理资料

    java.net.BindException: Address already in use: JVM_Bind 当尝试通过`new ServerSocket(port)`创建一个服务器套接字,并指定端口号`port`(该值应在0到65536之间)时,如果出现此异常,表明所指定的端口已被...

    hadoop hbase 错误日志级解决

    2,localhost: java.net.BindException: Address already in use 3,ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times 4,ERROR: org.apache.hadoop.hbase.MasterNotRunningException: ...

    如何根据Wowza服务器日志中的出错信息进行故障排查

    vhost WARN 200 - _defaultVHost_Bind failed, try again ([any]:1935): java.net.BindException: Address already in use ``` **原因分析:** 该错误通常发生在同一台服务器上有多个WowzaMediaServer实例同时运行...

    错误总结.doc

    4. **java.net.BindException: Address already in use: JVM_Bind**:这意味着8080端口已被其他服务占用。你可以通过修改Tomcat配置文件`server.xml`来改变Tomcat的默认端口,如示例所示,将端口改为80或其他未使用...

    idea启动项目报端口号冲突或被占用的解决方法

    nested exception is: java.net.BindException: Address already in use: JVM_Bind 这种错误通常是由于端口号冲突或被占用导致的。 结论 Idea启动项目报端口号冲突或被占用的解决方法可以帮助开发人员快速解决...

Global site tag (gtag.js) - Google Analytics