package com.njust.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class ServerUDPReceiver {
// 侦听的UDP端口号
private int port = -1;
public static DatagramSocket socket_for_receive_udp = null;
private byte[] buffer = new byte[8192];
private DatagramPacket incomming = null;
private boolean isFlag = true;
//private Thread serverThread = null;
public ServerUDPReceiver(int i_port) {
port = i_port;
} public void startUDPReceiver() {
try {
socket_for_receive_udp = new DatagramSocket(this.port);
Thread serverThread = new Thread(new Runnable() {
public void run() {
try {
while (isFlag) {
try {
// 构造一个接收数据包
incomming = new DatagramPacket(buffer,buffer.length);
// 接收数据报
System.out.println("before receive!");
socket_for_receive_udp.receive(incomming); int length, offset;
byte[] realData = null;
length = incomming.getLength();
offset = incomming.getOffset();
realData = new byte[length];
System.arraycopy(buffer, offset, realData,offset, length);
System.out.println("reveive data:" + new String(realData)); } catch (Exception ee) {
ee.printStackTrace();
System.out.println("In while!!!");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
socket_for_receive_udp.close();
}
}
});
serverThread.start();
} catch (Exception e) {
e.printStackTrace();
if (e.toString().indexOf(
"java.net.BindException: Address already in use: JVM_Bind") != -1) {
System.out.println("Server 已经启动,不能重复启动!");
}
}
}
public void stopUDPReceiver(){
if(socket_for_receive_udp!=null){
//serverThread.stop();
this.isFlag = false;
System.out.println("before socket close!");
socket_for_receive_udp.close();
}
}
}问题是这样的:首先启动startUDPReceiver,然后关闭stopUDPReceiver,提示错误如下:
java.net.SocketException: socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(Unknown Source)
at java.net.DatagramSocket.receive(Unknown Source)
at com.njust.socket.ServerUDPReceiver$1.run(ServerUDPReceiver.java:29)
at java.lang.Thread.run(Unknown Source)
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class ServerUDPReceiver {
// 侦听的UDP端口号
private int port = -1;
public static DatagramSocket socket_for_receive_udp = null;
private byte[] buffer = new byte[8192];
private DatagramPacket incomming = null;
private boolean isFlag = true;
//private Thread serverThread = null;
public ServerUDPReceiver(int i_port) {
port = i_port;
} public void startUDPReceiver() {
try {
socket_for_receive_udp = new DatagramSocket(this.port);
Thread serverThread = new Thread(new Runnable() {
public void run() {
try {
while (isFlag) {
try {
// 构造一个接收数据包
incomming = new DatagramPacket(buffer,buffer.length);
// 接收数据报
System.out.println("before receive!");
socket_for_receive_udp.receive(incomming); int length, offset;
byte[] realData = null;
length = incomming.getLength();
offset = incomming.getOffset();
realData = new byte[length];
System.arraycopy(buffer, offset, realData,offset, length);
System.out.println("reveive data:" + new String(realData)); } catch (Exception ee) {
ee.printStackTrace();
System.out.println("In while!!!");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
socket_for_receive_udp.close();
}
}
});
serverThread.start();
} catch (Exception e) {
e.printStackTrace();
if (e.toString().indexOf(
"java.net.BindException: Address already in use: JVM_Bind") != -1) {
System.out.println("Server 已经启动,不能重复启动!");
}
}
}
public void stopUDPReceiver(){
if(socket_for_receive_udp!=null){
//serverThread.stop();
this.isFlag = false;
System.out.println("before socket close!");
socket_for_receive_udp.close();
}
}
}问题是这样的:首先启动startUDPReceiver,然后关闭stopUDPReceiver,提示错误如下:
java.net.SocketException: socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(Unknown Source)
at java.net.DatagramSocket.receive(Unknown Source)
at com.njust.socket.ServerUDPReceiver$1.run(ServerUDPReceiver.java:29)
at java.lang.Thread.run(Unknown Source)
解决方案 »
- 求解,有时input=keyboard.nextLine()语句被忽略的问题
- java菜鸟求助!
- 十万火急求各位高手帮忙,要写一个能够自由添加文字的程序,文字最好能移动的,最后还要保存,我该怎么做呢?最好有代码,谢谢啦(十万火急)
- 接口问题,初学者,大哥们帮帮忙
- 请问如何获得ResultSet的行数?
- 如何把中文转换为字符串?
- 求bytecode编辑器,能改import语句的
- java swing 怎么实现eclipse上的带图片的下拉列表,就是eclipse菜单下的那些,比如运行按钮
- 散分,又长了一个角,虽然离星星还很远,但是总算越来越近了,也给郁闷的生活多少带来了点性奋!
- 请问如何得到MOUSE在整个屏幕中的位置。谢谢
- 将sql.date变成指定的类型转换成util.date
- java UDP可靠通信
public void stopUDPReceiver(){
if(socket_for_receive_udp!=null){
//serverThread.stop();
this.isFlag = false;
System.out.println("before socket close!");
socket_for_receive_udp.close();
}
}这个地方调用close但是你线程里面还在执行 连接被提前关闭,应该把这个close写到 while (isFlag) {...}后面,stopUDPReceiver()里置下this.isFlag = false;就行了。