TCP 客户端
package network;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
public class TCPEchoClient {
/**
* @param args
*/
public static void main(String[] args) {
String server = args[0];
byte[] data = args[1].getBytes();
int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;
try {
Socket socket = new Socket(server, servPort);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write(data);
int totalBytesRcvd = 0;
int bytesRcvd;
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd, data.length
- totalBytesRcvd)) == -1)
throw new SocketException("Connection closed prematurely");
totalBytesRcvd += bytesRcvd;
// data array is full
System.out.println("Received: " + new String(data));
socket.close();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
read方法三个参数:1) 接受数据的数组
2)接收的字节存放的位置,字节偏移量
3)放入数组的最大字节数
read方法在没有数据读时会阻塞等待,直到有新的数据可读。如果socket的另一端关闭,read方法返回-1。
Socket创建:
Socket(InetAddress remoteAddr, int remotePort) //远程链接地址,使用本地socket地址和可用端口地址
Socket(String remoteHost, int remotePort) //远程链接地址,使用本地socket地址和可用端口地址
Socket(InetAddress remoteAddr, int remotePort, InetAddress localAddr, int localPort) //远程链接地址,使用指定socket地址和端口地址
Socket(String remoteHost, int remotePort, InetAddress localAddr, int localPort)
Socket()
Socket: 操作
void connect(SocketAddress destination)
void connect(SocketAddress destination, int timeout)
InputStream getInputStream()
OutputStream getOutputStream()
void close()
void shutdownInput()
void shutdownOutput()
connect方法使指定的终端打开一个TCP链接,socketAddress抽象类代表了socket的一般格式,它的子类InetSocketAddress是针对TCP/IP的特殊格式。与远程主机通信是通过与套接字关联的输入输出流来实现的。
close()方法套接字及其关联的输出流
shutdownInput()关闭TCP流的输入端,任何没有读取的数据都被丢弃,包括被socket缓存、正在传输、即将到达的数据。
shutDownOutput()关闭TCP流的输出端。但已经写入套接字流的将尽量保证发送到另一端。
Socket: 获取/检测属性
InetAddress getInetAddress()
int getPort()
InetAddress getLocalAddress()
int getLocalPort()
SocketAddress getRemoteSocketAddress()
SocketAddress getLocalSocketAddress()
InetSocketAddress: 创建与访问
InetSocketAddress(InetAddress addr, int port)
InetSocketAddress(int port) //使用特殊的"任何"地址来创建实例
InetSocketAddress(String hostname, int port) //接收字符串主机名的构造函数会尝试将其解析成相应的 IP 地址
static InetSocketAddress createUnresolved(String host, int port)//不对主机名进行解析情况下创建实例
boolean isUnresolved()//是否可达
InetAddress getAddress()
int getPort()
String getHostName()
String toString()
InetSocketAddress类为主机地址和端口创建了一个唯一不可变的组合,静态方法createUnresolved,创建 InetSocketAddress 实例时没有对主机名进行解析,或解析失败,isUnresolved()方法将返回 true。