学习了基于java 的网络编程,关于udp 的网络编程,这方面的东西前几天难住了哥,现在解决了,做个笔记。同时分享一下给以后的同学。
UDP是并不是可靠的传输方式,字节序列并没有得到校验,所以传输文件时出现错误也是难免的.因为,txt,doc和jpg本身即使出错也不会影响打开,顶多出现个别字符或是个别像素错误不会影响整体,而exe则是cpu的指令执行序列你错一个就将会导致程序无法执行。
对于文件传输还是建议使用tcp,点对点的传输。
下面是我的代码,希望对各位用。
客服端:
import java.io.FileInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* udp 文件传输,客户端
* @author jun
* @date: 2012-11-15
*/
public class Client {
public static void main(String[] args) {
FileInputStream fis = null; //file
DatagramSocket sendSocket= null; //socket
DatagramPacket sendPacket =null; //send packet
DatagramPacket getPacket = null; //get packet
InetAddress ip = null; //ip
try {
sendSocket = new DatagramSocket();
int port = 8888;
ip = InetAddress.getLocalHost();
fis = new FileInputStream("E:\\test.mp3");
byte[] buf =new byte[1024];
int i;
while((i = fis.read(buf, 0, 1024) )==1024){
System.out.println(i);
sendPacket = new DatagramPacket(buf, buf.length, ip, port);
sendSocket.send(sendPacket);
Thread.sleep(1); //简单的防止丢包现象
}
System.out.println(i);
sendPacket = new DatagramPacket(buf, 0,i, ip, port);
sendSocket.send(sendPacket);
Thread.sleep(1); //简单的防止丢包现象
System.out.println("client send done.");
byte[] getBuf = new byte[1024];
getPacket = new DatagramPacket(getBuf, getBuf.length);
sendSocket.receive(getPacket);
//get feedback message
String backMes = new String(getBuf, 0, getPacket.getLength());
System.out.println("feefBack:"+backMes);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fis !=null){
fis.close();
}
if(sendSocket != null){
sendSocket.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
服务端:
import java.io.FileOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
/**
* udp 文件传输,服务端
* @author jun
* @date: 2012-11-15
*/
public class Server {
public static void main(String[] args) {
DatagramSocket serverSocket = null; //socket
InetAddress ip = null; //ip
DatagramPacket getPacket = null; //get packet
DatagramPacket sendPacket = null; //send packet
FileOutputStream fos = null; //file
int port = 8888; //port
//InetAddress sendIP= null; //send ip
//int sendPort = -1; //send port
try {
ip = InetAddress.getLocalHost();
serverSocket = new DatagramSocket(port , ip);
fos = new FileOutputStream("D:\\test.mp3");
byte[] buf = new byte[1024];
int i=0;
while(true){
getPacket = new DatagramPacket(buf,0,buf.length);
serverSocket.receive(getPacket);
i = getPacket.getLength();
fos.write(buf,0,i);
if(i<1024){
break;
}
}
//System.out.println("server saved!");
//sendIP = getPacket.getAddress();
//sendPort = getPacket.getPort();
SocketAddress sendAddress = getPacket.getSocketAddress();
String feedback = "received successfully!";
byte[] backBuf = feedback.getBytes();
sendPacket = new DatagramPacket(backBuf, backBuf.length, sendAddress);
serverSocket.send(sendPacket);
//System.out.println(feedback);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
serverSocket.close();
fos.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}