博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【代码积累】TCP client
阅读量:4099 次
发布时间:2019-05-25

本文共 3080 字,大约阅读时间需要 10 分钟。

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();				}							}		}			}}

转载地址:http://xthii.baihongyu.com/

你可能感兴趣的文章
Linux下SVN客户端使用教程
查看>>
i2c-tools
查看>>
Linux分区方案
查看>>
Linux 查看服务器开放的端口号
查看>>
nc 命令详解
查看>>
如何使用 systemd 中的定时器
查看>>
git命令速查表
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>
OpenFeign学习(五):OpenFeign请求结果处理及重试控制
查看>>
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
OpenFeign学习(七):Spring Cloud OpenFeign的使用
查看>>
OpenFeign学习(八):Spring Cloud OpenFeign的加载配置原理
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>