/***第一种:客户端Socket通过构造方法连接服务器***///客户端Socket可以通过指定IP地址或域名两种方式来连接服务器端,实际最终都是通过IP地址来连接服务器//新建一个Socket,指定其IP地址及端口号Socket socket = new Socket("192.168.0.7",80);/***Socket 客户端 一些常用设置***///客户端socket在接收数据时,有两种超时:1.连接服务器超时,即连接超时;2.连接服务器成功后,接收服务器数据超时,即接收超时//*设置socket 读取数据流的超时时间socket.setSoTimeout(5000);//发送数据包,默认为false,即客户端发送数据采用Nagle算法;//但是对于实时交互性高的程序,建议其改为true,即关闭Nagle算法,客户端每发送一次数据,无论数据包大小都会将这些数据发送出去socket.setTcpNoDelay(true);//设置客户端socket关闭时,close()方法起作用时延迟1分钟关闭,如果1分钟内尽量将未发送的数据包发送出去socket.setSoLinger(true, 60);//设置输出流的发送缓冲区大小,默认是8KB,即8096字节socket.setSendBufferSize(8096);//设置输入流的接收缓冲区大小,默认是8KB,即8096字节socket.setReceiveBufferSize(8096);//作用:每隔一段时间检查服务器是否处于活动状态,如果服务器端长时间没响应,自动关闭客户端socket//防止服务器端无效时,客户端长时间处于连接状态socket.setKeepAlive(true);/*** Socket客户端向服务器端发送数据 ****///客户端向服务器端发送数据,获取客户端向服务器端输出流OutputStream os = socket.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os);BufferedWriter bw = new BufferedWriter(osw);//代表可以立即向服务器端发送单字节数据socket.setOOBInline(true);//数据不经过输出缓冲区,立即发送socket.sendUrgentData(65);//"A"//向服务器端写数据,写入一个缓冲区//注:此处字符串最后必须包含“\r\n\r\n”,告诉服务器HTTP头已经结束,可以处理数据,否则会造成下面的读取数据出现阻塞//在write()方法中可以定义规则,与后台匹配来识别相应的功能,例如登录Login()方法,可以写为write("Login|test,123 \r\n\r\n"),供后台识别;bw.write("Login|test,123 \r\n\r\n");//发送缓冲区中数据,必须有bw.flush();/*** Socket客户端读取服务器端响应数据 ****///socket.isConnected代表是否连接成功过if((socket.isConnected() == true) && (socket.isClosed() == false)){//判断Socket是否处于连接状态//客户端接收服务器端的响应,读取服务器端向客户端的输入流InputStream is = socket.getInputStream();//缓冲区byte[] buffer = new byte[is.available()];//读取缓冲区is.read(buffer);//转换为字符串String responseInfo = new String(buffer);//日志中输出Log.i("TEST", responseInfo);} //关闭网络socket.close();/***第二种:通过connect方法连接服务器***/Socket socket_other = new Socket();//使用默认的连接超时socket_other.connect(new InetSocketAddress("192.168.0.7",80));//连接超时2ssocket_other.connect(new InetSocketAddress("192.168.0.7",80),2000);//关闭socketsocket_other.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}