我的代码:当客户端发送消息数到2000条时,服务端接受数据会丢包,请问这个程序哪里有问题,或者有哪些好的解决办法,很急,谢谢!!
import java.lang.Thread;
import java.net.*;
import java.io.*;
public class UDPClient extends Thread {
private DatagramSocket s;
private InetAddress hostAddress;
private byte[] buf=new byte[10240];
private DatagramPacket dp=new DatagramPacket(buf,buf.length);
private int id; public UDPClient(int identifier){
id=identifier;
try{
s=new DatagramSocket();
hostAddress=InetAddress.getByName("localhost");
}catch(UnknownHostException e){
System.err.println("Cannot find host");
System.exit(1);
}catch(SocketException e){
System.err.println("Can't open Socket");
e.printStackTrace();
System.exit(1);
}
} public void run(){
try{
for(int i=0;i<1000;i++){//消息数
String outMessage="Client # " + id + ", message# " + i;
System.out.println("outMessage is " + outMessage);
s.send(Dgram.toDatagram(outMessage,hostAddress,UDPServer.INPORT));
/*
s.receive(dp);
String rcvd="rcvd is Client #"+id+",rcvd from "+
dp.getAddress()+","+
dp.getPort()+":"+
Dgram.toString(dp);
System.out.println(rcvd);*/
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
s.receive(dp);
}catch(IOException e){
e.printStackTrace();
System.exit(1);
}
} public static void main(String[] args){
for (int i=0;i<1;i++)//客户数量
new UDPClient(i).start();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.sql.Date;import com.utilities.OracleConnection;public class UDPServer {
static final int INPORT=1711;
private byte[] buf=new byte[10240];
private DatagramPacket dp=new DatagramPacket(buf,buf.length);
private DatagramSocket socket; public UDPServer(){
try{
socket = new DatagramSocket(INPORT);
System.out.println("hhj Server started!");
while(true){
socket.receive(dp);
String rcvd=Dgram.toString(dp)+", from ddress:"+dp.getAddress()+
",port:"+dp.getPort();
//String sql = "insert into message (content,address,port) values ('"
// +Dgram.toString(dp)+"','"+dp.getAddress()+"','"+dp.getPort()+"')";
System.out.println("rcvd is " + rcvd);
//String echoString=" Echoed: "+rcvd;
//DatagramPacket echo=Dgram.toDatagram(echoString,dp.getAddress(),dp.getPort());
//socket.send(echo);
}
}
catch(SocketException e){
System.err.println("Can't open socket");
System.exit(1);
}
catch(IOException e){
System.err.println("Communication error!");
e.printStackTrace();
}
}
public static void main(String[] args){
/*
OracleConnection oc = new OracleConnection();
if(!oc.connected){
try {
oc.open();
} catch (Exception e) {
e.printStackTrace();
}
}*/
new UDPServer();
}
/*
public UDPServer(){
try{
socket=new DatagramSocket(INPORT);
System.out.println("hhj Server started!");
while(true){
socket.receive(dp);
String rcvd=Dgram.toString(dp)+", from ddress:"+dp.getAddress()+
",port:"+dp.getPort();
System.out.println(rcvd);
String echoString="Echoed:"+rcvd;
DatagramPacket echo=Dgram.toDatagram(echoString,dp.getAddress(),dp.getPort());
socket.send(echo);
}
}catch(SocketException e){
System.err.println("Can't open socket");
System.exit(1);
}catch(IOException e){
System.err.println("Communication error!");
e.printStackTrace(); }
}
*/}
// Dgram.java 数据报格式
import java.net.*; public class Dgram {
public static DatagramPacket toDatagram(
String s,InetAddress destIA,int destPort){
byte[] buf=new byte[s.length()+1];
s.getBytes(0,s.length(),buf,0);
return new DatagramPacket(buf,buf.length,destIA,destPort);
}
public static String toString(DatagramPacket p){
return new String(p.getData(),0,p.getLength());
}
}
import java.lang.Thread;
import java.net.*;
import java.io.*;
public class UDPClient extends Thread {
private DatagramSocket s;
private InetAddress hostAddress;
private byte[] buf=new byte[10240];
private DatagramPacket dp=new DatagramPacket(buf,buf.length);
private int id; public UDPClient(int identifier){
id=identifier;
try{
s=new DatagramSocket();
hostAddress=InetAddress.getByName("localhost");
}catch(UnknownHostException e){
System.err.println("Cannot find host");
System.exit(1);
}catch(SocketException e){
System.err.println("Can't open Socket");
e.printStackTrace();
System.exit(1);
}
} public void run(){
try{
for(int i=0;i<1000;i++){//消息数
String outMessage="Client # " + id + ", message# " + i;
System.out.println("outMessage is " + outMessage);
s.send(Dgram.toDatagram(outMessage,hostAddress,UDPServer.INPORT));
/*
s.receive(dp);
String rcvd="rcvd is Client #"+id+",rcvd from "+
dp.getAddress()+","+
dp.getPort()+":"+
Dgram.toString(dp);
System.out.println(rcvd);*/
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
s.receive(dp);
}catch(IOException e){
e.printStackTrace();
System.exit(1);
}
} public static void main(String[] args){
for (int i=0;i<1;i++)//客户数量
new UDPClient(i).start();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.sql.Date;import com.utilities.OracleConnection;public class UDPServer {
static final int INPORT=1711;
private byte[] buf=new byte[10240];
private DatagramPacket dp=new DatagramPacket(buf,buf.length);
private DatagramSocket socket; public UDPServer(){
try{
socket = new DatagramSocket(INPORT);
System.out.println("hhj Server started!");
while(true){
socket.receive(dp);
String rcvd=Dgram.toString(dp)+", from ddress:"+dp.getAddress()+
",port:"+dp.getPort();
//String sql = "insert into message (content,address,port) values ('"
// +Dgram.toString(dp)+"','"+dp.getAddress()+"','"+dp.getPort()+"')";
System.out.println("rcvd is " + rcvd);
//String echoString=" Echoed: "+rcvd;
//DatagramPacket echo=Dgram.toDatagram(echoString,dp.getAddress(),dp.getPort());
//socket.send(echo);
}
}
catch(SocketException e){
System.err.println("Can't open socket");
System.exit(1);
}
catch(IOException e){
System.err.println("Communication error!");
e.printStackTrace();
}
}
public static void main(String[] args){
/*
OracleConnection oc = new OracleConnection();
if(!oc.connected){
try {
oc.open();
} catch (Exception e) {
e.printStackTrace();
}
}*/
new UDPServer();
}
/*
public UDPServer(){
try{
socket=new DatagramSocket(INPORT);
System.out.println("hhj Server started!");
while(true){
socket.receive(dp);
String rcvd=Dgram.toString(dp)+", from ddress:"+dp.getAddress()+
",port:"+dp.getPort();
System.out.println(rcvd);
String echoString="Echoed:"+rcvd;
DatagramPacket echo=Dgram.toDatagram(echoString,dp.getAddress(),dp.getPort());
socket.send(echo);
}
}catch(SocketException e){
System.err.println("Can't open socket");
System.exit(1);
}catch(IOException e){
System.err.println("Communication error!");
e.printStackTrace(); }
}
*/}
// Dgram.java 数据报格式
import java.net.*; public class Dgram {
public static DatagramPacket toDatagram(
String s,InetAddress destIA,int destPort){
byte[] buf=new byte[s.length()+1];
s.getBytes(0,s.length(),buf,0);
return new DatagramPacket(buf,buf.length,destIA,destPort);
}
public static String toString(DatagramPacket p){
return new String(p.getData(),0,p.getLength());
}
}
udp只有一种丢包形势 就是完全丢失 (具体看中国协议联盟的协议介绍)
只有一种机制避免 就是问答的形势 客户端发了包 然后叫服务器返回发送成功 这2跳都收到说明发送成功
如果服务器没有反应 客户端就从发这个包