本文共 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/