服务端代码
public class ServerTest {
private static int TIME = 0;
public static void main(String[] args) {
System.out.println("即将开始监听");
try {
final ServerSocket serverSocket =new ServerSocket(8123);
System.out.println("server start...");
while (Boolean.TRUE) {
System.out.println("循环监听");
Socket socket=serverSocket.accept();
InputStream inputStream=socket.getInputStream();//
DataInputStream dis = new DataInputStream(inputStream);
while (dis.available() <= 4) {
if(TIME>9) {
break;
}
Thread.sleep(1000);
System.out.println("available: " + dis.available());
TIME++;
}
byte[] data = new byte[dis.available()];
dis.read(data);
Packet packet;
packet = PacketFactory.createPacket(data); //采用工厂模式生成包对象
packet.unserialize(data); // 将数据装换成对象的属性
packet.process();// 具体业务操作
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端代码
public class ClientTest {
public static void main(String[] args) {
Socket socket;
for(int i=0;i<8;i++) {
try {
socket = new Socket("127.0.0.1",8123);
OutputStream outputStream=socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(outputStream);
// LoginPacket login = new LoginPacket();
// login.setUserName("huangsheng----"+i);
// login.setPassword("123");
MessagePacket msg = new MessagePacket();
msg.setMfriendName("huangsheng");
msg.setmContent("nizaiganshenmea");
dos.write(msg.serialize()); // 将消息包转换成指定格式的数据
dos.flush();
socket.shutdownOutput();//
dos.close();
outputStream.close();
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
消息格式如下
服务端采用工厂模式。不需要知道用户传进来的是什么包,直接create就行。