【代码积累】TCP client

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.logging.Level;
import java.util.logging.Logger;


public class TCPClient implements Runnable{
	/*绑定本地IP,不指定端口/指定端口
	 * 设置服务端IP:port
	 * 连接成功后持续发送一段时间或一定次数的消息*/
	private Socket socket = null;
	private InputStream in = null;
	private OutputStream out = null;
	private boolean isRunning = true;
	private int cnt = 10;
	private Logger logger = Logger.getLogger(this.getClass().getName());
	
	/*这里不应该在构造函数中进行connect,构造函数应该能够快速返回,便于调用者快速创建对象,应该把connect的动作放到run中进行*/
	public TCPClient(SocketAddress localaddress,SocketAddress remoteaddress) {
		String host = ((InetSocketAddress)remoteaddress).getAddress().getHostAddress();
		int port = ((InetSocketAddress)remoteaddress).getPort();
		
		InetAddress localAddr =  ((InetSocketAddress)localaddress).getAddress();
		int localPort = ((InetSocketAddress)localaddress).getPort();
		
		while( null == socket ) {
			try {
				socket = new Socket(host, port, localAddr, localPort);
				if( null != socket ) {
					in = socket.getInputStream();
					out = socket.getOutputStream();
					new Thread(new Receiver(socket)).start();
					logger.log(Level.INFO, "connetion succeeded!");
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public void run() {
		while( !Thread.currentThread().isInterrupted() && true == isRunning ) {
			//send messages to the server several times
			String message = new String("This is client,message number "+cnt);
			try {
				out.write(message.getBytes());
				logger.log(Level.INFO, "Send : "+message);
				
				cnt--;
				if( cnt < 1 ) {
					socket.close();   /*程序运行结束,需要关闭所有的socket资源,以及stream资源*/
					isRunning = false;
				}
				
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	private class Receiver implements Runnable {
		private Socket socket = null;
		private InputStream in = null;
		private boolean isRunning = true;
		private byte[] recvbuf = new byte[256];
		
		public Receiver(Socket socket) {
			this.socket = socket;
			
			if( null != this.socket ) {
				try {
					in = this.socket.getInputStream();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while( !Thread.currentThread().isInterrupted() && true == isRunning ) {
				try {
					int cnt = in.read(recvbuf);
					if( cnt > 0 ) {
						logger.log(Level.INFO, new String(recvbuf,0,cnt));
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					try {
						in.close();  /*如果这里不关闭,会有资源泄漏*/
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					isRunning = false;
					e.printStackTrace();
				}
				
			}
		}
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值