📄 server.java
字号:
import java.io.FileOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;
class DataStruct {
// 文件的id,十位,多文件同時傳送時用來區分不同的文件
public String fileId;
// 包的序號
public int index;
// 包中有效數據的長度
public int len;
// 包
public byte[] data;
// 解析包內容
public DataStruct(byte[] data) {
fileId = new String(data, 0, 10);
index = (data[10] & 0x000000FF) | (data[11] << 8 & 0x0000FF00)
| (data[12] << 16 & 0x00FF0000) | data[13] << 24 & 0xFF000000;
len = (data[14] & 0x000000FF) | (data[15] << 8 & 0x0000FF00)
| (data[16] << 16 & 0x00FF0000) | data[17] << 24 & 0xFF000000;
this.data = data;
}
}
//Server:
//Server:
//---------------------------------------------------------------------
public class Server {
public static void main(String[] args) {
try {
DatagramSocket reciveSocket = new DatagramSocket(7774);
ProcData proc = new ProcData();
byte[] buf = new byte[50 * 1024];
DatagramPacket dp = new DatagramPacket(buf, 50 * 1024);
while (true) {
reciveSocket.receive(dp);
proc.proc(dp);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
class ProcData {
private FileOutputStream fos;
Map<Integer, DataStruct> packBuf = new TreeMap<Integer, DataStruct>();
int nextIndex = 1;
DatagramSocket sendSocket;
public ProcData() {
try {
fos = new FileOutputStream("c:/1.bmp");
sendSocket = new DatagramSocket();
} catch (Exception e) {
System.out.println("error in new ProcData()");
}
}
public void proc(DatagramPacket dp1) {
DataStruct data = new DataStruct(dp1.getData());
if (data.index == nextIndex) {
try {
// 序號是下一個序號,寫文件
nextIndex++;
fos.write(data.data, 18, data.len);
// 處理緩衝中的內容
Iterator<Entry<Integer, DataStruct>> iter = packBuf.entrySet()
.iterator();
while (iter.hasNext()) {
data = iter.next().getValue();
if (data.index == nextIndex) {
nextIndex++;
fos.write(data.data, 18, data.len);
}
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (data.index > nextIndex) {
// 如果序號大於應當接收的序號,則保存在緩衝中....
// TODO: 如果某一序號的包很久都沒有傳過來,則需要發消息到客 戶端,要求從新發送
packBuf.put(data.index, data);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -