Java代码 <embed height="15" width="14" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="always" quality="high" >
- private static String sendSynMsg(String ipAddr, byte[] datas) throws Exception{
- //解析服务器地址和端口号
- int dotPos = ipAddr.indexOf(':');
- String ip = ipAddr.substring(0, dotPos).trim();
- int port = Integer.parseInt(ipAddr.substring(dotPos+1).trim());
- InetSocketAddress endpoint = new InetSocketAddress(ip , port);
- Socket socket = null;
- OutputStream out = null;
- InputStream in = null;
- try {
- socket = new Socket();
- //设置发送逗留时间2秒
- socket.setSoLinger(true, 2);
- //设置InputStream上调用 read()阻塞超时时间2秒
- socket.setSoTimeout(2000);
- //设置socket发包缓冲为32k;
- socket.setSendBufferSize(32*1024);
- //设置socket底层接收缓冲为32k
- socket.setReceiveBufferSize(32*1024);
- //关闭Nagle算法.立即发包
- socket.setTcpNoDelay(true);
- //连接服务器
- socket.connect(endpoint);
- //获取输出输入流
- out = socket.getOutputStream();
- in = socket.getInputStream();
- //输出请求
- out.write(datas);
- out.flush();
- //接收应答
- BufferedReader br = new BufferedReader( new InputStreamReader(in) , 4096);
- StringWriter received = new StringWriter(4096);
- char[] charBuf = new char[4096];
- int size = 0;
- char lastChar = 0;
- do {
- size = br.read(charBuf , 0 , 4096);
- lastChar = charBuf[size-1];
- if(lastChar == 0){
- received.write(charBuf, 0, size - 1);
- }
- //System.out.println(received.toString());
- }while(lastChar != 0);
- return received.toString();
- } finally {
- if (out != null) {
- try {
- out.close();
- } catch(Exception ex) {
- ex.printStackTrace();
- }
- }
- if (in != null) {
- try {
- in.close();
- } catch(Exception ex) {
- ex.printStackTrace();
- }
- }
- if (socket != null) {
- try {
- socket.close();
- } catch(Exception ex) {
- ex.printStackTrace();
- }
- }
- }
- }
程序中的关键点:
1. 不直接使用new Socket(String ip , int port)的构造函数,而是设置了socket的环境参数后再连接
2.设置发送逗留时间 socket.setSoLinger(true, 2); 这个参数是socket发送数据时的超时,如果对方在固定时间内不接受,则关闭socket。与socket.setSoTimeout(2000)不 同,这个是设置InputStream上调用 read()阻塞超时时间。
3.socket.setTcpNoDelay(true);关闭Nagle算法。这使得在调用out.flush();时总能第一时间的发送数据包(这个适用于你的数据包是完整的一次性发送的前提)。
4.根据应用协议的实际大小,优化你的接收和发送缓冲,这两个参数可以有效提高网络通信的效率。
5.使用char的数组配合StringWriter作为接收数据的写入,这个比使用readLine方法实现更优雅。
一点小经验,和大家分享 。