1.6、TCP
传输中添加通道的原理:
从一端来的输入,可能无法被另外一边的理解,添加了这个通道,就相当于进行了一次翻译,让两边都能理解。
1、文字传输
客户端
1.连接服务器—>Socket
2.发送消息
3.代码:
package com.edwin.lesson2;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @author EdwinD
* @create 2020.08.20 下午 05:07
* @desc 客户端1
**/
public class TcpClient1 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
try {
// 1.需要知道服务器的地址
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
// 2.设置连接端口号
int port = 7777;
// 3.创建一个socket,进行连接。Socket是有参数的,默认无参数
socket = new Socket(serverIP, port);
// 4.发送消息:IO流
os = socket.getOutputStream();
os.write("Welcome,EdwinD is Learning Web".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务器
1.建立服务的端口—>ServerSocket
2.等待用户的连接—>Accept
3.代码:
package com.edwin.lesson2;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author EdwinD
* @create 2020.08.20 下午 05:08
* @desc 服务端1
**/
public class TcpServer1 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
// 提供服务器的地址:serverSocket,套接字。
// 1.我有一个地址
serverSocket = new ServerSocket(7777);
while (true) {
// 2.等待客户链接过来,这里的socket等同于TcpClient1里面的socket,
socket = serverSocket.accept();
// 3.读取客户端
is = socket.getInputStream();
/*
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))! = -1){
String msg = new String(buffer,0,len);
System.out.println(msg);
}
*/
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
System.out.println(baos.toString());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
// 关闭资源
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
输出:
2、文件上传
同样分为客户端和服务端。
客户:
package com.edwin.lesson2;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* @author EdwinD
* @create 2020.08.20 下午 06:06
* @desc 客户端2
**/
public class TcpClient2 {
public static void main(String[] args) throws IOException {
// 1.创建一个Socket连接
// 注意port不可以和Client1的重合,否则会报错。
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 7788);
// 2.创建一个输出流
OutputStream os = socket.getOutputStream();
// 3.文件流
FileInputStream fils = new FileInputStream(new File("Study.jpg"));
// 4.写出文件
byte[] buffer = new byte[1024];
int len;
while ((len = fils.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
// 通知服务器,已经结束了
socket.shutdownInput();
// 确定接受完毕,才能断开连接
InputStream inputStream = socket.getInputStream();
// 接受的是String类型的数组,
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = inputStream.read(buffer2)) != -1) {
baos.write(buffer2, 0, len2);
}
System.out.println(baos.toString());
// 5.关闭资源
baos.close();
inputStream.close();
fils.close();
os.close();
socket.close();
}
}
服务:
package com.edwin.lesson2;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author EdwinD
* @create 2020.08.20 下午 06:14
* @desc 服务端2
**/
public class TcpServer2 {
public static void main(String[] args) throws IOException {
// 1.创建服务
ServerSocket serverSocket = new ServerSocket(7788);
// 2.监听客户端的连接
Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接,一旦链接,就失败了。
// 3.得到输入流
InputStream is = socket.getInputStream();
// 4.文件输出
FileOutputStream receive = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
receive.write(buffer, 0, len);
}
// 通知客户端,接收完成
OutputStream os = socket.getOutputStream();
os.write("接受完毕,可以断开。".getBytes());
// 5.关闭资源
receive.close();
is.close();
socket.close();
serverSocket.close();
}
}
输出:
路漫漫其修远兮,吾将上下而求索。
参考文献
《【狂神说Java】网络编程实战讲解》
视频链接
2020.08.24