socket基础问题

weidu23 2013-12-25 02:08:20
我的一个Server端代码:
import java.io.BufferedReader;  
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread {
private Socket socket;

public Server(Socket socket) {
this.socket = socket;
}

public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream());

String data = reader.readLine();
writer.println(data);
writer.close();
socket.close();
} catch (IOException e) {

}
}

public static void main(String[] args) throws Exception {
while (true) {
new Server((new ServerSocket(8080)).accept()).start();
}
}
}

问题:
这个程序会报错,可是,如果把main函数里面的while(true)去掉,程序就正确了,为什么呢?
...全文
188 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
soiesang 2013-12-25
  • 打赏
  • 举报
回复
weidu23 2013-12-25
  • 打赏
  • 举报
回复
引用 5 楼 UDBuilder 的回复:
因为new ServerSocket(8080)这个实例占用了端口,还没来得及释放,下次再在这个端口创建ServerSocket,当然就是占用了
原来我错在new ServerSocket.java
UDBuilder 2013-12-25
  • 打赏
  • 举报
回复
因为new ServerSocket(8080)这个实例占用了端口,还没来得及释放,下次再在这个端口创建ServerSocket,当然就是占用了
weidu23 2013-12-25
  • 打赏
  • 举报
回复
引用 2 楼 birdsaction 的回复:
new Server((new ServerSocket(8080)).accept()).start(); 这个实例一次就行了,你无限实例化对象 当然有内存溢出。 ServerSocket server = new ServerSocket(8080); while(true){ Socket s = server.accept(); }
1、while(true)中,server.accept()这里应该会线程阻塞并等待吧,这样不会内存溢出的。 2、我的问题在3楼有新的东西,希望能有助于你开导我的思路 。 3、望指教,谢谢
weidu23 2013-12-25
  • 打赏
  • 举报
回复
引用 1 楼 zhzwsjc1000 的回复:
报的是内存溢出吧,outofMemoryError.
不是内存溢出: 是端口被占用。
F:\Test>java Server
Exception in thread "main" java.net.BindException: Address already in use: JVM_B
ind
        at java.net.PlainSocketImpl.socketBind(Native Method)
        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 Server.main(Server.java:32)
-------------------- 但是,我[cmd]->[netstat -ano]看了下,端口9000并没有被占用,而且,就算报错也把数据输出和返回给了客户端 。 我不明白,请指教
Birds2018 2013-12-25
  • 打赏
  • 举报
回复
new Server((new ServerSocket(8080)).accept()).start(); 这个实例一次就行了,你无限实例化对象 当然有内存溢出。 ServerSocket server = new ServerSocket(8080); while(true){ Socket s = server.accept(); }
大大点点 2013-12-25
  • 打赏
  • 举报
回复
报的是内存溢出吧,outofMemoryError.

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧