美好的一天。
我发送一个用户名字符串(所以我知道以下文件属于哪个用户)然后是从android客户端到运行在java中的服务器的字节数组(用于音频)。 我想打开不同的端口,但因为服务器在专用网络中运行所以如果我想打开更多的端口,那么我需要添加更多的端口转发功能,这是非常愚蠢的。
我能够分别发送用户名和字节数组的字符串,但是当用户名后的音频文件时,音频文件将被加速。
server.java
while (true) {
Socket socket = listener.accept();
try {
InputStream in = socket.getInputStream();
BufferedReader inFileN = new BufferedReader(new InputStreamReader(socket.getInputStream()));
if (fileName==null) {
fileName=inFileN.readLine();
File dir = new File("/home/xxx/Documents/" + fileName);
dir.mkdirs();
}
String filePath = "/home/xxx/Documents/"+fileName+"/voice8K16bitmono.pcm";
FileOutputStream os = null;
byte[] buffer = new byte[1024];
int count;
try {
os = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while ((count = in.read(buffer)) > 0)
{
os.write(buffer, 0, count);
}
} finally {
socket.close();
}
客户端用于写入用户名字符串
try {
s = new Socket("localhost", 9090);
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
out.print(userID);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
客户端用于在某种情况下编写音频文件
try {
s = new Socket("localhost", 9090);
outToServer = s.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
while (isRecording) {
recorder.read(sData, 0, BufferElements2Rec);
detectSilence(sData, threshold);
try {
byte bData[] = short2byte(sData);
//os.write(bData, 0, BufferElements2Rec * BytesPerElement);
outToServer.write(bData, 0, BufferElements2Rec * BytesPerElement);
} catch (IOException e) {
e.printStackTrace();
}
}
或者,如果我想从单个客户端发送多种数据类型,还有其他更好的方法吗?
ps:我此时尚未实现多线程服务器,因为我想确保它首先适用于单个用户
谢谢。