67,512
社区成员
发帖
与我相关
我的任务
分享
int length = byteArrayToInt(byteArray, 3); //取第四位,后4个byte转成int
byte[] packHead = new byte[2];
byte[] packType = new byte[1];
byte[] packLen = new byte[4];
然后就直接三句话连续读取(is 就是指 socket.getInputStream()所得到的输入流): is.read(packHead);
// 需要的话还可以检查下head信息是否正确
if (packHead[0] != 0x1f || packHead[1] != 0x1f) throw new RuntimeException("头信息错误");
is.read(packType);
// 可以用switch进行分支判断
switch(packType[0]) {
case (byte)0x1:
...
break;
case (byte)0x2:
...
break;
case (byte)0x3:
...
break;
default:
throw new RuntimeException("类型信息错误" + packType[0]);
}
is.read(packLen); // 读取长度后可以用1楼的建议来转成int
public static int byteArrayToInt(byte[] b, int offset) {
int value= 0;
for (int i = 0; i < 4; i++) {
int shift= (4 - 1 - i) * 8;
value +=(b[i + offset] & 0x000000FF) << shift;
}
return value;
}
byte[] byteArray = new byte[] { 0, 0, 1, 0 };
System.out.println(byteArrayToInt(byteArray, 0));
import java.io.*;
import java.net.*;
import java.util.*;
public class EchoServer {
public static final int PORT = 10000;
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(PORT);
try {
while (true) {
System.out.println("服务端就绪,等待客户端连接");
// 侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
Socket socket = serverSocket.accept();
System.out.println("有客户端连接上来了,已建立Socket链接");
EchoServerWorker worker = new EchoServerWorker(socket);
System.out.println("启动工作线程");
new Thread(worker).start();
}
} finally {
serverSocket.close();
}
}
}
class EchoServerWorker implements Runnable {
private Socket socket; // 工作线程所服务的目标Socket
EchoServerWorker(Socket socket) {
this.socket = socket;
}
public void run() {
try {
try {
// 准备输入输出端口
Scanner sc = new Scanner(socket.getInputStream());
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
System.out.println("Socket for " + socket.getPort() + " started.");
// 读取信息并直接返回,这里按行读取(\n)
String str;
while ((str = sc.nextLine()) != null) {
System.out.println("【From Client】" + str);
out.write(str + "\n");
out.flush();
}
} finally {
socket.close();
System.out.println("Scoket for " + socket.getPort() + " closed.");
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
import java.util.*;
public class EchoClient {
public static final int PORT = 10000;
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", PORT);
Scanner sc = new Scanner(socket.getInputStream());
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
int counter = 0;
while (true) {
out.write("Client: " + counter++ + "\n");
out.flush();
String back = sc.nextLine();
System.out.println("【From Server】" + back);
Thread.sleep(1000);
}
}
}