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

问题描述

本人最近想学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 blocke.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 blocke.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_Bindat 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) 问题补充:第一次的时候端口没有被占用,为什么内容没有数出来呢。第二次端口占用了,内容却数出来了。这是为什么呢?

解决方案

引用,(不停止第一次开启的服务)第二次输出了文本内容,却报了个地址被占用的错.这是为什么呢?你启动第一个,就占用了你的端口,然后再启动,又用了这个端口,所以会错了啊。就比如你用tomcat的时候,你启动一次,第二次启动,就报你jvm 8080重复的错误是吧。不懂的站内问我吧。
解决方案二:
引用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 要先启动)这样就应该可以了
解决方案三:
引用运行到这一句就没了下文。是不是Socket服务端压根就没检测到有客户端在访问啊?到底是哪有问题呢。我刚才说了哦,你先启动服务器端,然后再启动客户端。
解决方案四:
引用public static void main(String[] args) { SocketRemot remot=new SocketRemot(); socketClient ket=new socketClient(getAddIp()); remot.reMoteRun(); ket.client(); remot.closeSocket(); } 你不这样弄啊,你用两个工程分别启动啊,别一起启动啊。你先启动你的服务器SocketRemot,然后在另外的工程,编写client,并且启动。
解决方案五:
你在引用while((readLine=read.readLine())!=null){print.print(readLine);} 的while处打个断点,然后debug一下,看看第一次到底有没有执行到这个地方
解决方案六:
引用第一次的时候端口没有被占用,为什么内容没有数出来呢。第二次端口占用了,内容却数出来了。这是为什么呢? 这是因为你没有调用 flush()。在你的引用while((readLine=read.readLine())!=null){print.print(readLine);} 这个 while() 外面加上print.flush()试试
解决方案七:
SocketRemot remot=new SocketRemot(); socketClient ket=new socketClient(getAddIp()); 你怎把服务和客户端放到同一个main方法里
解决方案八:
不停止第一次开启的服务,那么9000端口一直被占用了,后续再启动一个还想使用这个端口当然不行了
解决方案九:
因为你第一次启动的时候,一个socket已经使用了这个端口,而且没有被正常关闭,所以,在你再次启动的时候,它当然就 in use 了啊

时间: 2024-11-18 07:03:54

Socket编程java.net.BindException: Address already in use: JVM_Bind的相关文章

java.net.BindException: Address already in use: JVM_Bind&amp;amp;lt;null&amp;amp;gt;:8080是什么原因

问题描述 我启动Tomcat时报的错是什么原因 解决方案 解决方案二:8080端口被占用解决方案三:C:ProgramFilesApacheSoftwareFoundationTomcat6.0confserver.xml把这个文件中编辑查找8080应该有三个,然后把第二个改了,改个大点的数,这样被占用的可能就小了.解决方案四:顶一下,楼上的真强.解决方案五:确实是..解决方案六:javaJVM端口被占用了.

jsp项目在服务器上报这样的错误(java.net.BindException: Address already in use: connect)

问题描述 我有一个项目,在本机测试时好的,可是在服务器上测试,一直报java.net.BindException: Address already in use: connect com.mysql.jdbc.CommunicationsException:Communications link failure due to underlying exception:** BEGIN NESTED EXCEPTION **java.net.SocketExceptionMESSAGE: java

Address already in use: JVM_Bind:8080类似问题解决方法

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gaochaojs.blog.51cto.com/812546/163660 1.严重: Error initializing endpoint java.net.BindException: Address already in use: JVM_Bind:8080 2.严重: Catalina.start LifecycleException:  Protocol handl

Java Socket编程----通信是这样炼成的

Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术.下面就让我们一起揭开Socket的神秘面纱. Socket编程 一.网络基础知识(参考计算机网络) 关于计算机网络部分可以参考相关博客: TCP/IP协议栈及OSI参考模型详解> http://wangdy.blog.51cto.com/3845563/1588379 1.两台计算机间进行通讯需要以

Java Socket编程实现简单的问候服务_java

本文实例讲解了Java Socket编程实现简单的问候服务的详细代码,供大家参考,具体内容如下 服务器端: 实现一个最简单的Hello服务,打印输出客户端IP地址到控制台,对任何连接的客户端都会发送一串字符(Hello, Java Socket)然后关闭与客户端连接.等待下一个客户端的连接请求到来. 客户端: 实现一个最简单的Socket连接到Hello服务器端,接受服务器端发送过来的字节数据打印并输出内容到控制台. 关键技巧: 由于JAVA中提供非常多的输入与输出流API,导致很多初学者接触J

Java Socket编程实例(一)- TCP基本使用_java

一.服务端代码: import java.net.*; // for Socket, ServerSocket, and InetAddress import java.io.*; // for IOException and Input/OutputStream public class TCPEchoServer { private static final int BUFSIZE = 32; // Size of receive buffer public static void main

Java Socket编程实例(四)- NIO TCP实践_java

一.回传协议接口和TCP方式实现: 1.接口: import java.nio.channels.SelectionKey; import java.io.IOException; public interface EchoProtocol { void handleAccept(SelectionKey key) throws IOException; void handleRead(SelectionKey key) throws IOException; void handleWrite(

Java Socket编程实例(二)- UDP基本使用_java

一.服务端代码: import java.io.*; import java.net.*; public class UDPEchoServer { private static final int ECHOMAX = 255; // Maximum size of echo datagram public static void main(String[] args) throws IOException { int servPort = 5500; // Server port Datagr

java socket编程

  一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客