serverSocket = new ServerSocket(port);//首先創(chuàng)建一個服務端口
//等待客戶端的連接請求
socket = serverSocket.accept();
//等待客戶端的連接請求
socket = serverSocket.accept();
final String socketAddress = socket.getRemoteSocketAddress().toString();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ServerActivity.this, "成功建立與客戶端的連接 : " + socketAddress, Toast.LENGTH_SHORT).show();
Log.i("Lin", "成功建立與客戶端的連接 : " + socketAddress);
}
});
為了防止接收消息時,服務器inputStream.read()讀取消息時產(chǎn)生阻塞,以換行符("\n")結(jié)束inputStream.read()
byte[] bytes = new byte[1];
StringBuilder info = new StringBuilder();
while (inputStream.read(bytes) != -1) {
String str = new String(bytes);
if (str.equals("\n")) {
break;
}
info.append(new String(bytes));
}
final String finalInfo = info.toString();
Log.i("Lin", "text = " + finalInfo);
runOnUiThread(new Runnable() {
@Override
public void run() {
mEtReceive.setText(mEtReceive.getText().toString() + socketAddress + " : " + finalInfo + "\n");
}
});
為了防止接收消息時,服務器inputStream.read()接受文件時產(chǎn)生阻塞,以文件MD5校驗碼進行校驗,從而結(jié)束inputStream.read()
byte[] remote = new byte[32];
String md5 = "";
if (inputStream.read(remote) != -1) {
md5 = nullOfString(new String(remote));
}
final String root = Environment.getExternalStorageDirectory().getPath();
Log.i("Lin", root);
byte[] inputByte = new byte[1024 * 1024];
int len = 0;
long fileSize = 0;
DataInputStream dis = new DataInputStream(inputStream);
// 文件名和長度
String fileName = dis.readUTF();
final long fileLength = dis.readLong();
Log.i("Lin", "fileName = " + fileName);
Log.i("Lin", "fileLength = " + fileLength);
mPath = root + "/ECG/" + fileName;
File file = new File(root + "/ECG/");
if (!file.exists()) file.mkdir();
file = new File(mPath);
FileOutputStream fileOutputStream = new FileOutputStream(file);
String fileMD5 = nullOfString(getFileMD5(new File(mPath)));
while (!md5.equals(fileMD5) && (len = dis.read(inputByte, 0, inputByte.length)) > 0) {
fileSize += len;
fileOutputStream.write(inputByte, 0, len);
fileOutputStream.flush();
fileMD5 = nullOfString(getFileMD5(new File(mPath)));
Log.i("Lin", "md5 = " + md5 + " file = " + fileMD5);
Log.i("Lin", "fileLength = " + fileLength + " fileSize = " + fileSize + " " + (fileSize * 100 / fileLength) + "%")
;
final long finalFileSize = fileSize;
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressDialog.setMessage((finalFileSize * 100 / fileLength) + "%");
mProgressDialog.show();
}
});
if (md5.equals(fileMD5)) {
fileOutputStream.close();
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressDialog.hide();
}
});
}
}
Log.i("Lin", "md52 = " + md5 + " file2 = " + getFileMD5(file));
fileMD5 = nullOfString(getFileMD5(new File(mPath)));
Log.i("Lin", "file = " + fileMD5);
final String finalFileMD = fileMD5;
final String finalMd = md5;
runOnUiThread(new Runnable() {
@Override
public void run() {
mEtReceive.setText(mEtReceive.getText().toString() + "文件路徑:" + mPath + "\n");
mEtReceive.setText(mEtReceive.getText().toString() + "file = " + finalFileMD + "\n");
mEtReceive.setText(mEtReceive.getText().toString() + "text = " + finalMd + "\n");
}
});
socket = new Socket();
socket.connect(new InetSocketAddress(ip, port));
//ip= 服務器ip
//port= 服務器端口
try {
if (socket == null) return;
OutputStream om = socket.getOutputStream();
om.write(Constant.SERVER_TEXT.getBytes());
om.write(returnServer.getBytes());
om.write("\n".getBytes());//[10]
om.flush();
} catch (Exception e) {
e.printStackTrace();
Log.i("Lin", e.toString());
}
為了防止發(fā)送消息時,服務器inputStream.read()讀取消息時產(chǎn)生阻塞,客戶端以換行符結(jié)束發(fā)送(om.write("\n".getBytes());)
File file = new File(finalImagePath);
if (file.exists()) {
final String fileMD5 = nullOfString(getFileMD5(file));
OutputStream outputStream = socket.getOutputStream();
runOnUiThread(new Runnable() {
@Override
public void run() {
mEtReceive.setText(mEtReceive.getText().toString() + "file = " + fileMD5 + "\n");
}
});
FileInputStream fileInputStream = new FileInputStream(file);
outputStream.write(Constant.SERVER_FILE.getBytes());
outputStream.flush();
outputStream.write(fileMD5.getBytes());
outputStream.flush();
DataOutputStream dis = new DataOutputStream(outputStream);
// 文件名和長度
dis.writeUTF(file.getName());
dis.flush();
dis.writeLong(file.length());
dis.flush();
byte[] buffer = new byte[1024 * 1024];
int len = 0;
while ((len = fileInputStream.read(buffer, 0, buffer.length)) > 0) {
dis.write(buffer, 0, len);
dis.flush();
}
fileInputStream.close();
Log.i("Lin", "傳輸成功");
}
為了防止發(fā)送文件時,服務器inputStream.read()接受文件時產(chǎn)生阻塞,客戶端先向服務器發(fā)送文件MD5校驗碼再發(fā)送文件,服務器對接收文件進行校驗從而結(jié)束inputStream.read()阻塞。
private static String getFileMD5(File file) {
if (!file.isFile()) {
return null;
}
MessageDigest digest;
FileInputStream in;
try {
byte[] buffer = new byte[1024];
int len;
digest = MessageDigest.getInstance("MD5");
in = new FileInputStream(file);
while ((len = in.read(buffer, 0, 1024)) != -1) {
digest.update(buffer, 0, len);
}
in.close();
BigInteger bigInt = new BigInteger(1, digest.digest());
return bigInt.toString(16);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前名稱:Android的Socket通信使用方法-創(chuàng)新互聯(lián)
當前URL:http://aaarwkj.com/article0/jdoio.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App設計、Google、網(wǎng)站維護、品牌網(wǎng)站設計、云服務器、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)