概述
TCP(Transmission Control Protocol)传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议。
模型图片
使用方法
客户端
- 建立socket连接,需要 ip、端口
- 获取输出流 getOutputStream
- 发送消息 write
- 关闭 流和连接
服务端
- 设置服务端口
- 监听socket连接 accept
- 获取输入流 getInputStream
- 接受消息 ByteArrayOutputStream
- 关闭 流和连接
传输图片或文件
- 客户端获取文件 FileInputStream
- 写到缓冲区
- 服务端接受文件
常用api
优化
。。。
实例
客户端
/**
* @function 客户端发消息,服务端接收
*/
public class TcpCilent {
public static void main(String[] args) throws Exception {
//需要通信的ip,端口
InetAddress ip = InetAddress.getByName("localhost");
int port = 9090;
//建立socket连接
Socket socket = new Socket(ip, port);
//获取输出流
OutputStream os = socket.getOutputStream();
os.write("你好 钢镚核恒!".getBytes());
//通知服务端,我已经发送完毕
socket.shutdownOutput();
//接收服务端最后的消息,验证是否接收完全
InputStream is = socket.getInputStream();
ByteArrayOutputStream 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());
//关闭 流、断开连接等
os.close();
socket.close();
}
}
服务端
public class TcpServer {
public static void main(String[] args) throws IOException {
//设置服务端口
ServerSocket serverSocket = new ServerSocket(9090);
//等待socket连接
Socket accept = serverSocket.accept();
//获取输入流
InputStream is = accept.getInputStream();
//管道流 专门用于字节数组输入输出的实现类
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//缓冲区
byte[] buffer = new byte[1024];
//数据长度,没有数据时len == -1
int len;
while ((len = is.read(buffer)) != -1){
baos.write(buffer,0,len);
}
//防止乱码
System.out.println(baos.toString());
//通知客户,我已经接受完毕
OutputStream os = accept.getOutputStream();
os.write("接收完毕!".getBytes());
//关闭 流、断开连接等
baos.close();
is.close();
accept.close();
serverSocket.close();
}
}
传输图片
文件输入到缓冲区
FileInputStream fis = new FileInputStream(new File("socket/gangan.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1){
os.write(buffer,0,len);
}
文件输出到本地
FileOutputStream fos = new FileOutputStream(new File("socket/dudu.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}