java网络socket编程(二)之Socket客户端

一、socket实现读写

当我们想要在Java中使用TCP/IP通过网络连接到服务器时,就需要创建java.net.Socket对象并连接到服务器。假如希望使用Java NIO,也可以创建Java NIO中的SocketChannel对象。使用输出流在socket上发送数据,同时还可以使用输入流读取数据,不过打多数都为在客户端只能读取或只写入数据,而不是二者同时进行。最常见的模式是,客户端发送一个请求,然后服务器响应,客户端发送另外一个请求,服务器再做出响应,这个过程会继续直到客户端或服务器完成工作,然后关闭连接。

下面为客户端获取数据的一个例子:

<span style="font-family:Microsoft YaHei;">       /**
	 * 读取socket信息
	 * @param serverHost
	 * @author zzj
	 */
	public static void readSteam(String serverHost) {
		Socket socket =  null;
		try {
			socket = new Socket(serverHost,13);
			//数据连接、读取操作时间 
			socket.setSoTimeout(1000*10);
			InputStream inputStream = socket.getInputStream();
			System.out.println("read stream..");
			InputStreamReader reader = new InputStreamReader(inputStream);
			StringBuffer sBuffer = new StringBuffer();
			int a = 0;
			for(a=reader.read();a!=-1;a=reader.read()){
				sBuffer.append(a);
			}
			System.out.println(sBuffer);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if (socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
</span>
<span style="font-family:Microsoft YaHei;">       /**
	 * 向服务器写数据
	 * @param serverHost socket服务器地址
	 * @param port 端口
	 * @author zzj
	 */
	public static void writeToServer(String serverHost,int port){
		Socket socket = null;
		try {
			//创建并连接服务器
			socket = new Socket(serverHost,port);
			
			//设置操作超时时间30S
			socket.setSoTimeout(1000*30);
			
			//向服务器提交数据,需要使用输出流
			OutputStream outputStream = socket.getOutputStream();
			
			//为性能效率,把输出流串联到一个writer上
			OutputStreamWriter writer = new OutputStreamWriter(outputStream,"utf-8");
			writer.write("this is a client socket message!!!!");
			
			//刷新输出,关闭流
			writer.flush();
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if (socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}</span>

二、 半关闭连接

socket.close()方法可以同时关闭Socket的输入和输出。但是有时候可能只希望关闭连接的一般,即输入或者输出,那么可以使用shutdownInput/shutdownOutput方法可以只关闭连接的一半。这并不关闭socket,实际上他会调整与Socket连接的流,是他认为已经到了流的末尾,关闭输入之后在读取输入流会返回-1.关闭输出之后再写入Socket则会跑出一个IOException异常。下面为简单的代码实现:
<span style="font-family:Microsoft YaHei;">Socket socket =  null;
		try {
			socket = new Socket(serverHost,13);
			//数据连接、读取操作时间 
			socket.setSoTimeout(1000*10);
			InputStream inputStream = socket.getInputStream();
			System.out.println("read stream..");
			InputStreamReader reader = new InputStreamReader(inputStream);
			StringBuffer sBuffer = new StringBuffer();
			int a = 0;
			for(a=reader.read();a!=-1;a=reader.read()){
				sBuffer.append(a);
			}
			//关闭输入流
			socket.shutdownInput();
			//下面使用输出流
			OutputStream outputStream = socket.getOutputStream();
			//....
			System.out.println(sBuffer);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if (socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}</span>
注意,即使输入和输出的关闭方法都关闭了,仍然需要调用close进行流的关闭,因为shutdown只影响流,而不影响socket的连接资源,如所占用的端口不会释放。另外可以通过isInputShutdown,isOutputShutdown等方法来确定是否关闭了输入输出流等。

Socket类是java完成其他TCP操作的基础类,如Url类,UrlConncetion,HttpUrlConnection等类最终都会调用这个方法来实现数据传输 这类使用原生代码与注解操作系统的本地tcp栈进行通信。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值