TCP概述
TCP/IP C/S
通信双方的地址
- IP
- 端口号
规则:网络通信的协议
TCP/IP参考模型
1. IP
IP地址:InetAddress
-
唯一定位一台网络计算机
-
127.0.0.1:本机 localhost
-
IP地址分类:
-
ipv4/ipv6
-
ipv4 127.0.0.1,4个字节组成,0-255,42亿
-
ipv6 fe80::24e7:f059:2c83:3a37%8 128位,8个无符号整数表示的
2001:0bb2:aaaa:0015:0000:0000:1222:1123
-
公网(互联网)-私网(局域网)
192.168.xx.xx
-
-
域名:记忆IP问题
- IP:www.jd.com
package com.wangxu.lessonIP;
import java.net.InetAddress;
import java.net.UnknownHostException;
//测试IP
public class TestInetAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress1);
InetAddress inetAddress3 = InetAddress.getByName("localhost");
System.out.println(inetAddress3);
InetAddress inetAddress4 = InetAddress.getLocalHost();
System.out.println(inetAddress4);
//查询网站IP地址
InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress2);
//常用方法
System.out.println(inetAddress1.getAddress());
System.out.println(inetAddress1.getCanonicalHostName());//规范的名字
System.out.println(inetAddress1.getHostName());//IP
System.out.println(inetAddress1.getHostAddress());//域名,或者自己的电脑名称
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
2.端口
端口表示计算机上的一个程序的进程
-
不同的进程有不同的端口号,用来区分软件
-
被规定 0-65535
-
TCP,UDP:65535*2,单个协议下,端口号不能冲突
-
端口分类
-
公有端口0-1023(尽量不要使用)
- HTTP:80
- HTTPS:443
- FTP:21
- TELENT:23
-
程序注册端口:1024–49151,分配用户或者程序
- Tomcat:8080
- MYSQL:3306
- Oracle:1521
-
动态,私有:49152-65535
netstat -ano#查看所有端口 netstat -ano|findstr "5900"#查看指定端口 tasklist|findstr "8696"#查看指定端口的进程
-
3.通信协议
TCP/IP协议簇
- TCP:用户传输协议
- 连接稳定
- 三次握手,四次挥手
- 客户端,服务端
- 传输完成,释放连接,效率低
- UDP:用户数据报协议
- 不连接,不稳定
- 客户端,服务端:没有明确的界限
- DDOS:洪水攻击
- IP:网络互连协议
4.TCP实现聊天
-
客户端
1.连接服务器通过Socket
2.发送消息
package com.wangxu.lessonIP; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; //客户端 public class TCPClientDemo01 { public static void main(String[] args) { Socket socket =null; OutputStream outputStream =null; //1.要知道服务器的地址 try { InetAddress serverIP = InetAddress.getByName("127.0.0.1"); //2.端口号 int port = 9999; //3.创建一个socket连接 socket = new Socket(serverIP,port); //4.发送消息 IO流 outputStream = socket.getOutputStream(); outputStream.write("hello".getBytes()); } catch (Exception e) { e.printStackTrace(); }finally { if (outputStream!=null){ try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
-
服务器
1.建立服务的端口ServerSocket
2.等待用户的连接通过accept
3.接收用户消息
package com.wangxu.lessonIP;
import javax.sound.midi.SoundbankResource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TCPSeverDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket =null;
InputStream inputStream =null;
ByteArrayOutputStream byteArrayOutputStream =null;
//1.得有一个地址
try {
serverSocket = new ServerSocket(9999);
//2.等待客户端连接
socket = serverSocket.accept();
//3.读取客户端消息
inputStream = socket.getInputStream();
//管道流
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
byteArrayOutputStream.write(buffer,0,len);
}
System.out.println(byteArrayOutputStream.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
if (byteArrayOutputStream!=null){
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream!=null){
try {
inputStream.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();
}
}
}
}
}
5.TCP实现文件上传
客户端:
package com.wangxu.lessonIP;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClientDemo02 {
public static void main(String[] args) throws IOException {
//1.创建SOCKET连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
//2.创建输出流
OutputStream outputStream = socket.getOutputStream();
//3.读取文件流
FileInputStream fileInputStream = new FileInputStream(new File("头像.jpg"));
//4.写出文件
byte[] buffer = new byte[1024];
int len;
while((len=fileInputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
//通知服务器,我已经结束
socket.shutdownOutput();
//确定接受完毕,断开连接
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2=inputStream.read(buffer2))!=-1){
byteArrayOutputStream.write(buffer2,0,len2);
}
System.out.println(byteArrayOutputStream.toString());
//5.关闭资源
byteArrayOutputStream.close();
inputStream.close();
fileInputStream.close();
outputStream.close();
socket.close();
}
}
服务端:
package com.wangxu.lessonIP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServerDemo02 {
public static void main(String[] args) throws IOException {
//1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//2.监听客户端的连接
Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
//3.获取输入流
InputStream inputStream = socket.getInputStream();
//4.文件输出
FileOutputStream fileOutputStream = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while((len=inputStream.read(buffer))!=-1){
fileOutputStream.write(buffer,0,len);
}
//通知客户端接收完毕
OutputStream outputStream = socket.getOutputStream();
outputStream.write("我已接收完毕,可以断开".getBytes());
//关闭资源
fileOutputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
传输成功会在src下多出一个receive.jpg文件