目录
一、基于Socket的TCP编程
客户端Socket的工作过程包含以下四个基本的步骤:
服务器程序的工作过程包含以下四个基本的步骤:
二:代码案例:
一、基于Socket的TCP编程
客户端Socket的工作过程包含以下四个基本的步骤:
- 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
- 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用getOutputStream()
- 方法获得输出流,进行数据传输 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器
- 放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
- 关闭 Socket:断开客户端到服务器的连接,释放线路
服务器程序的工作过程包含以下四个基本的步骤:
- 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
- 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
- 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
- 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
二:代码案例:
public class TCPtest3 {
@Test
public void client() throws Exception {
//1、创建Socket对象,指明服务器端的ip和端口号
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
//2、获取一个输出流,用于输出数据
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream("D:\\IdeaProjects\\Javaadvanced\\src\\InternetNews\\测试图.jpg");
byte[] buffer = new byte[fis.available()];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
//关闭数据传输
socket.shutdownOutput();
//5.接收来自于服务器端的数据,显式到控制台
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[20];
int lens;
while ((lens = is.read(bytes)) != -1) {
baos.write(bytes, 0, lens);
}
System.out.println(baos.toString());
fis.close();
os.close();
socket.close();
baos.close();
is.close();
}
@Test
public void server() throws Exception {
//1、创建服务器的ServerSocket,指明自己的端口号
ServerSocket ss = new ServerSocket(9090);
//2、调用accept()表示接收来自于客户端的Socket
Socket accept = ss.accept();
InputStream is = accept.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("D:\\IdeaProjects\\Javaadvanced\\src\\InternetNews\\测试图1.jpg"));
byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
//6.服务器端基于客户端反馈
OutputStream os = accept.getOutputStream();
os.write("你好,照片已收到".getBytes());
fos.close();
is.close();
accept.close();
ss.close();
os.close();
}
}