/*
演示TCP传输协议
1、TCP分客户端和服务端
2、客户端(Socket),服务端(ServerSocket)
*/
/*
客户端:
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机
因为TCP是面向连接的,所以在建立socket连接时,就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输
步骤:
1、创建Socket服务,指定要连接的主机端口
2、获取socket流中的输出流
3、发送数据
4、为了显示服务端反馈来的信息,获取socket中的输入流,并打印在控制台
5、关闭socket
*/
import java.io.*;
import java.net.*;
//客户端
class TcpClient
{
public static void main(String[] args) throws Exception{
//创建客户端的socket服务,指定目的主机和端口。此时socket流产生,可读可写,
//socket流里面既有输入流,也有输出流
Socket s = new Socket("127.0.0.255",9999);
//为发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
//发送数据
out.write("服务端,你好~!TCP ge men lai le !".getBytes());
//为接收数据,获取相应的输入流
InputStream in = s.getInputStream();
//定义一个缓冲字节数组
byte[] buf = new byte[1024];
//数组有效长度,read()为阻塞式的
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
/*
定义端点接收/发送数据
服务端:
1、建立服务端的socket服务,ServerSocket();,监听一个端口
2、获取链接过来的客户端对象通过ServerSocket的accept();,这个方法是阻塞式的
3、客户端如果发过来数据,服务端要使用对应的客户端对象,并获取到该客户端对象的读取流
来读取发过来的数据
4、读到数据后需要作出相应的反馈,通过从客户端获取输出流OutputStream()来发信息
5、关闭服务端(可选操作)
*/
class TcpServer
{
public static void main(String[] args) throws Exception{
//建立服务端socket监听9999端口
ServerSocket ss = new ServerSocket(9999);
//获取socket对象,accept();方法是阻塞式的
Socket s = ss.accept();
//获取IP地址
String ip = s.getInetAddress().getHostAddress();
System.out.print(ip+"::");
//获取客户端发送的数据,使用客户端对象的读取流方法
InputStream in = s.getInputStream();
//缓冲数组
byte[] buf = new byte[1024];
int len = in.read(buf);//read(byte[])返回的是读取的字节数
System.out.println(new String(buf,0,len));
//为了回馈给客户端信息,从客户端获取输出流
OutputStream out = s.getOutputStream();
//接收到消息,2秒后再回馈给客户端
Thread.sleep(2000);
out.write("收到,客户端,你也好!".getBytes());
s.close(); //关闭客户端
//ss.close(); //关闭服务端
}
}
|