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();
}
}
}
}
}
【代码积累】TCP client
最新推荐文章于 2024-05-03 00:15:00 发布