写了一个简单的长连接和短连接的测试程序,贴上来mark一下 Server端的程序 public class Server { private Socket socket; private ServerSocket server; private InputStream in; private OutputStream out; private int maxSize = 0x10000; private static int port = 8181; private byte[] buffer = new byte[maxSize]; private static int clientCnt = 0; private byte[] bytesUp = new byte[2]; private byte[] bytesDown = new byte[2]; private long bytesSent = 0; private long bytesRecv = 0; private int length = 0; public static void main(String[] args) { new Server(); } public Server() { fillMsg(); try { server = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); return; } System.out.println("Started:" + server); try { while (true) { socket = server.accept(); System.out.println("socket: " + socket); clientCnt++; System.out.println("accept:" + String.valueOf(clientCnt)); run(); System.out.println("Total Bytes Read: " + String.valueOf(bytesRecv)); System.out.println("Total Bytes Sent: " + String.valueOf(bytesSent)); } } catch (IOException e) { e.printStackTrace(); } finally { try { server.close(); } catch (IOException e2) { e2.printStackTrace(); } } } public void run() { try { in = socket.getInputStream(); out = socket.getOutputStream(); } catch (IOException e) { try { socket.close(); System.out.println("socket closing..."); } catch (IOException e2) { e2.printStackTrace(); } return; } try { while (true) { /** * read data as data format = | bytesUp(2B) | bytesDown(2B) | * msgContent | */ length = in.read(bytesUp, 0, 2); if (length < 2) break; length = in.read(bytesDown, 0, 2); if (length < 2) break; length = bytesUp[1] & 0x000000ff; length = ((bytesUp[0] & 0x000000ff) << 8) | length; length = in.read(buffer, 0, length); System.out.println("Msg read " + length + " bytes."); bytesRecv += length; /** write data */ length = bytesDown[1] & 0x000000ff; length = ((bytesDown[0] & 0x000000ff) << 8) | length; bytesUp[0] = bytesUp[1] = 0; out.write(bytesDown, 0, 2); out.write(bytesUp, 0, 2); out.write(buffer, 0, length); out.flush(); System.out.println("Msg sent " + length + " bytes."); bytesSent += length; } } catch (IOException e) { e.printStackTrace(); return; } finally { try { System.out.println("socket closing..."); socket.close(); } catch (IOException e2) { e2.printStackTrace(); } } } public void fillMsg() { for (int i = 0; i < maxSize; i++) { buffer[i] = (byte) i; } } } client端演示程序 public class ClientSimulator extends Activity { private int msgCnt = 100; private int bytesDown = 1024; private int bytesUp = 16; private View configView = null; private final int MenuConfigID = 0x0; private final int MenuRefreshID = 0x1; private TextView txtLongConnRunTime = null; private TextView txtShortConnRunTime = null; private TextView txtMsgCnt = null; private TextView txtMsgUp = null; private TextView txtMsgDown = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupViews(); } public void setupViews() { setContentView(R.layout.main); txtLongConnRunTime = (TextView) findViewById(R.id.longConnRunTime); txtShortConnRunTime = (TextView) findViewById(R.id.shortConnRunTime); txtMsgCnt = (TextView) findViewById(R.id.txtMsgCnt); txtMsgUp = (TextView) findViewById(R.id.txtMsgUp); txtMsgDown = (TextView) findViewById(R.id.txtMsgDown); txtMsgCnt.setText(String.valueOf(msgCnt)); txtMsgUp.setText(String.valueOf(bytesUp)); txtMsgDown.setText(String.valueOf(bytesDown)); } class Task extends AsyncTask<Void, Void, Void> { LongConnClient longClient = null; ShortConnClient shortClient = null; @Override protected Void doInBackground(Void... params) { shortClient = new ShortConnClient(bytesUp, bytesDown, msgCnt); System.out.println(shortClient.getRunTime()); longClient = new LongConnClient(bytesUp, bytesDown, msgCnt); System.out.println(longClient.getRunTime()); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); txtLongConnRunTime.setText(String.valueOf(longClient.getRunTime())); txtShortConnRunTime .setText(String.valueOf(shortClient.getRunTime())); } } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MenuConfigID, 0, "配置"); menu.add(0, MenuRefreshID, 0, "测试"); return super.onCreateOptionsMenu(menu); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { case MenuConfigID: showConfigDialog(0); break; case MenuRefreshID: Task task = new Task(); task.execute((Void[]) null); break; default: } return super.onMenuItemSelected(featureId, item); } private void showConfigDialog(int error) { configView = getLayoutInflater().inflate(R.layout.configdlg, null); TextView edtMsgCnt = (TextView) configView.findViewById(R.id.edtMsgCnt); TextView edtMsgUp = (TextView) configView.findViewById(R.id.edtMsgUp); TextView edtMsgDown = (TextView) configView .findViewById(R.id.edtMsgDown); if (error != 0) { if ((error & 0x1) != 0) { edtMsgCnt.setText(String.valueOf(msgCnt)); edtMsgCnt.setError("请输入自然数"); edtMsgCnt.requestFocus(); } if ((error & 0x2) != 0) { edtMsgUp.setText(String.valueOf(bytesUp)); edtMsgUp.setError("请输入自然数"); edtMsgUp.requestFocus(); } if ((error & 0x4) != 0) { edtMsgDown.setText(String.valueOf(bytesDown)); edtMsgDown.setError("请输入自然数"); edtMsgDown.requestFocus(); } } AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(configView); builder.setTitle("参数配置"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int error = 0; TextView edtMsgCnt = (TextView) configView .findViewById(R.id.edtMsgCnt); TextView edtMsgUp = (TextView) configView .findViewById(R.id.edtMsgUp); TextView edtMsgDown = (TextView) configView .findViewById(R.id.edtMsgDown); msgCnt = Integer.parseInt(edtMsgCnt.getText().toString()); bytesUp = Integer.parseInt(edtMsgUp.getText().toString()); bytesDown = Integer.parseInt(edtMsgDown.getText().toString()); if (msgCnt < 1) error = error | 0x1; if (bytesUp < 1) error = error | 0x2; if (bytesDown < 1) error = error | 0x4; if (error != 0) { showConfigDialog(error); } else { txtMsgCnt.setText(String.valueOf(msgCnt)); txtMsgUp.setText(String.valueOf(bytesUp)); txtMsgDown.setText(String.valueOf(bytesDown)); } } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog dlg = builder.create(); dlg.show(); } } 客户端的短连接 public class ShortConnClient { public static final int port = 8181; public static final String host = "192.168.31.252"; private Socket socket; private InputStream in; private OutputStream out; private int maxSize = 0x10000; private byte[] buffer = new byte[maxSize]; private int msgCnt = 0; private int msgUp = 0; private int msgDown = 0; private long startTime = 0; private long endTime = 0; private long runTime = 0; private byte[] bytesUp = new byte[2]; private byte[] bytesDown = new byte[2]; private long bytesSent = 0; private long bytesRecv = 0; private InetSocketAddress addr = null; private int error = 0; private int length = 0; public static void main(String[] args) { new LongConnClient(16, 1024, 10); } public ShortConnClient(int upLength, int downLength, int msgCount) { fillMsg(); msgUp = upLength; msgDown = downLength; msgCnt = msgCount; startTime = System.currentTimeMillis(); addr = new InetSocketAddress(host, port); System.out.println(addr); for (int i = 0; i < msgCnt; i++) { run(); } System.out.println("Total Bytes Read: " + String.valueOf(bytesRecv)); System.out.println("Total Bytes Sent: " + String.valueOf(bytesSent)); endTime = System.currentTimeMillis(); if (endTime > startTime) runTime = endTime - startTime; System.out.println("runtime: " + String.valueOf(runTime)); } public void run() { try { socket = new Socket(); socket.setKeepAlive(true); socket.setTcpNoDelay(true); socket.connect(addr, 30 * 1000); } catch (IOException e) { error = 1; System.out.println("Connection Fail!"); System.out.println("socket closing..."); try { socket.close(); } catch (IOException e2) { } return; } try { in = socket.getInputStream(); out = socket.getOutputStream(); } catch (IOException e) { try { System.out.println("closing..."); socket.close(); return; } catch (IOException e2) { } return; } try { transport(); } catch (IOException e) { } finally { try { System.out.println("closing..."); socket.close(); } catch (IOException e) { } } } public void fillMsg() { for (int i = 0; i < maxSize; i++) { buffer[i] = (byte) i; } } public void transport() throws IOException { /** write data */ bytesUp[1] = (byte) (msgUp & 0x000000ff); bytesUp[0] = (byte) ((msgUp & 0x0000ff00) >>> 8); bytesDown[1] = (byte) (msgDown & 0x000000ff); bytesDown[0] = (byte) ((msgDown & 0x0000ff00) >>> 8); out.write(bytesUp, 0, 2); out.write(bytesDown, 0, 2); out.write(buffer, 0, msgUp); out.flush(); System.out.println("Msg sent " + msgUp + " bytes."); bytesSent += msgUp; /** * read data as data format = | bytesUp(2B) | bytesDown(2B) | msgContent * | */ length = in.read(bytesUp, 0, 2); if (length < 2) return; length = in.read(bytesDown, 0, 2); if (length < 2) return; length = bytesUp[1] & 0x000000ff; length = ((bytesUp[0] & 0x000000ff) << 8) | length; in.read(buffer, 0, length); System.out.println("Msg read " + length + " bytes."); bytesRecv += length; } public long getRunTime() { return runTime; } public int getErrorCode() { return error; } } 客户端的长连接 public class LongConnClient { public static final int port = 8181; public static final String host = "192.168.31.252"; private Socket socket; private InputStream in; private OutputStream out; private int maxSize = 0x10000; private byte[] buffer = new byte[maxSize]; private int msgCnt = 0; private int msgUp = 0; private int msgDown = 0; private long startTime = 0; private long endTime = 0; private long runTime = 0; private byte[] bytesUp = new byte[2]; private byte[] bytesDown = new byte[2]; private long bytesSent = 0; private long bytesRecv = 0; private int error = 0; private int length = 0; private InetSocketAddress addr; public static void main(String[] args) { new LongConnClient(16, 1024, 10); } public LongConnClient(int upLength, int downLength, int msgCount) { fillMsg(); msgUp = upLength; msgDown = downLength; msgCnt = msgCount; startTime = System.currentTimeMillis(); addr = new InetSocketAddress(host, port); System.out.println(addr); try { socket = new Socket(); // socket.se socket.setKeepAlive(true); socket.setTcpNoDelay(true); socket.connect(addr, 30 * 1000); } catch (IOException e) { error = 1; System.out.println("Connection Fail!"); System.out.println("socket closing..."); try { socket.close(); } catch (IOException e2) { } return; } run(); endTime = System.currentTimeMillis(); if (endTime > startTime) runTime = endTime - startTime; System.out.println("runtime: " + String.valueOf(runTime)); } public void run() { try { in = socket.getInputStream(); out = socket.getOutputStream(); } catch (IOException e) { try { System.out.println("closing..."); socket.close(); return; } catch (IOException e2) { } return; } try { for (int i = 0; i < msgCnt; i++) { transport(); } System.out .println("Total Bytes Read: " + String.valueOf(bytesRecv)); System.out .println("Total Bytes Sent: " + String.valueOf(bytesSent)); } catch (IOException e) { } finally { try { System.out.println("closing..."); socket.close(); } catch (IOException e) { } } } public void fillMsg() { for (int i = 0; i < maxSize; i++) { buffer[i] = (byte) i; } } public void transport() throws IOException { /** write data */ bytesUp[1] = (byte) (msgUp & 0x000000ff); bytesUp[0] = (byte) ((msgUp & 0x0000ff00) >>> 8); bytesDown[1] = (byte) (msgDown & 0x000000ff); bytesDown[0] = (byte) ((msgDown & 0x0000ff00) >>> 8); out.write(bytesUp, 0, 2); out.write(bytesDown, 0, 2); out.write(buffer, 0, msgUp); out.flush(); System.out.println("Msg sent " + msgUp + " bytes."); bytesSent += msgUp; /** * read data as data format = | bytesUp(2B) | bytesDown(2B) | msgContent * | */ length = in.read(bytesUp, 0, 2); if (length < 2) return; length = in.read(bytesDown, 0, 2); if (length < 2) return; length = bytesUp[1] & 0x000000ff; length = ((bytesUp[0] & 0x000000ff) << 8) | length; in.read(buffer, 0, length); System.out.println("Msg read " + length + " bytes."); bytesRecv += length; } public long getRunTime() { return runTime; } public int getErrorCode() { return error; } }