和UDP的发送端与接收端不同,TCP分为客户端和服务端分别对应Socket和ServerSocket。
Socket
实现了客户端套接字,套接字是两台机器间通信的端点。
connect(SocketAddress endpoint)方法:可以连接到指定的目的端。
构造方法:
Socket(InetAddress, port)
TCP客户端:
通过查阅Socket对象。发现在该对象建立时就可以连接指定的主机。
因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端存在并连接成功。形成通路后在该通道进行数据的传输。通路一旦建立就会有Socket流。
TCP传输的步骤:
- 创建Socket服务并指定要连接的主机和端口。
public static void main(String[] args) throws Exception {
//创建客户端的Socket服务,指定目的主机和端口。
Socket s = new Socket("192.168.56.1", 10003);
//为了发送数据,应该获取Socket流中的输出流。
OutputStream os = s.getOutputStream();
os.write("TCP, I am coming.".getBytes());
s.close();
}
TCP服务端:
定义端点接收数据并打印在控制台上。
- 建立服务端的Socket服务。通过ServerSocket建立。ServerScoket会监听端口。
- 获取连接过来的客户端对象。使用accept方法。该方法为阻塞式方法。没有连接时就会等。
- 客户端如果发过来数据那么服务端要使用对应的客户端对象并获取到该客户端对象的读取流来读取发送过来的数据并打印在控制台。
- 关闭服务端(可选操作)。
public static void main(String[] args) throws Exception{
//建立Socket服务并监听一个端口
ServerSocket ss = new ServerSocket(10003);
//通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();
//获取客户端发送过来的数据,那么要使用客户端对象的读取流方法
InputStream ins = s.getInputStream();
byte [] b = new byte[1024];
int len = ins.read(b);
System.out.println("IP:"+s.getInetAddress().getHostAddress());
System.out.println(new String(b, 0, len));
//关闭客户端
s.close();
}
TCP客户端与服务端交互
客户端:
public static void main(String[] args) throws Exception {
/*
* 建立Socket服务指定要连接的主机和端口
* 获取Socket流中的输出流通过网络发送给服务端
* 获取Socket流中输入流将服务端反馈的数据获取到并打印
* 关闭客户端资源
* */
Socket s = new Socket("192.168.56.1", 10004);
OutputStream out = s.getOutputStream();
out.write("Hello, server.".getBytes());
InputStream in = s.getInputStream();
byte [] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf, 0, len));
s.close();
}
服务端:
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(10004);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println("IP: " + ip);
InputStream in = s.getInputStream();
byte [] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf, 0, len));
OutputStream out = s.getOutputStream();
out.write("Hi,received.".getBytes());
s.close();
ss.close();
}
网友评论