1.网络编程中有两个主要的问题
1.如何准确定位到网络上的一台主机或者多台主机
2.找到主机之后如何进行通信
2.网络编程中的要素
3.IP
ip 在java中有个 类:InetAddress
123.0.0.1是本机的ip地址
ip地址的分类
ipv4 和 ipv6
ipv4: 127.0.0.1 0~255 共40亿个
ipv6:128位,8个无符号整数
4.TCP/IP
1.TCP/IP简介
TCP:场景:打电话
面向连接的可靠的传输协议
三次握手。四次挥手
客户端服务端
传输完成,释放连接 ,效率低
UDP场景:发短信
不连接,不稳定的
客户端。服务端没有明确的界限
不管有没有准备好,都可以发给你
2.案例1TCP实现的聊天
基于TCP实现的网络编程
总结来说就是
客户端:1.需要得到服务端的ip地址和端口号,通过套接字,创建连接
2.通过套接字创建输出流将自己想传输的数据传输给指定的服务端
服务端:1.需要创建一个指定端口号的serverSocket,
2.等待客户端连接。使用accpt监听连接的客户端,返回值是一个socket
3.通过这个socket读入客户端发送过来的数据。
客户端
/**
* @Author Rookie Coder
* @Description 客户端
* @Date
**/
public class ClientSocket {
public static void main(String[] args) {
OutputStream outputStream = null;
Socket socket = null;
// 获取服务端ip地址
try {
InetAddress in1 = InetAddress.getByName("127.0.0.1");
// 获取服务端端口号
int port = 8080;
// 创建一个socket
socket = new Socket(in1,port);
outputStream = socket.getOutputStream();
for (int i = 0; i < 50; i++) {
outputStream.write("你好客户端,我是小柒".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();
}
}
}
}
}
服务端:
/**
* @Author Rookie Coder
* @Description 服务端
* @Date
**/
public class MyServerSocket {
public static void main(String[] args) {
ServerSocket serverSocket = null;
InputStream inputStream = null;
ByteArrayOutputStream bos = null;
Socket socket = null;
try{
// 创建一个服务端 端口号为8080
serverSocket = new ServerSocket(8080) ;
while (true){
// 持续监听接收到的客户端
socket = serverSocket.accept();
// 获取客户端发来的消息
inputStream = socket.getInputStream();
// 建立一个管道流
bos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len=inputStream.read(bytes))!=-1){
bos.write(bytes,0,len);
}
System.out.println(bos);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (bos!=null){
try {
bos.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();
}
}
}
}
}
3.案例2:TCP实现文件上传
客户端:
**
* @Author Rookie Coder
* @Description 文件上传客户端
* @Date
**/
public class MyClientSocket {
public static void main(String[] args) {
// 1.创建一个socket,传入服务端ip 和服务端 端口号
Socket socket = null;
OutputStream outputStream = null;
FileInputStream fi1 = null;
try {
socket = new Socket(InetAddress.getByName("127.0.0.1"),8081);
// 2.创建输入流,读取要上传的文件
fi1 = new FileInputStream(new File("D:/JAVAStudy/IDEAWorkSpace/javaSECode/JavaSEReview/java_9netword/src/2.jpg"));
// 3.创建输出流,输出给服务端
outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len=fi1.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fi1!=null){
try {
fi1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
**
* @Author Rookie Coder
* @Description 文件上传客户端
* @Date
**/
public class MyClientSocket {
public static void main(String[] args) {
// 1.创建一个socket,传入服务端ip 和服务端 端口号
Socket socket = null;
OutputStream outputStream = null;
FileInputStream fi1 = null;
try {
socket = new Socket(InetAddress.getByName("127.0.0.1"),8081);
// 2.创建输入流,读取要上传的文件
fi1 = new FileInputStream(new File("D:/JAVAStudy/IDEAWorkSpace/javaSECode/JavaSEReview/java_9netword/src/2.jpg"));
// 3.创建输出流,输出给服务端
outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len=fi1.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fi1!=null){
try {
fi1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端:
/**
* @Author Rookie Coder
* @Description 文件上传服务端
* @Date
**/
public class MyServerSocket {
public static void main(String[] args) {
// 1. 创建一个Serversocket
Socket accept = null;
InputStream inputStream = null;
FileOutputStream f1 = null;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8081);
// 监听发送数据的客户端
accept = serverSocket.accept();
// 输出客户端所传输过来的数据
inputStream = accept.getInputStream();
// 创建一个管道流
f1 = new FileOutputStream(new File("revice.jpg"));
byte[] bytes = new byte[1024];
int len;
while ((len=inputStream.read(bytes))!=-1){
f1.write(bytes,0,len);
}
System.out.println(f1);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (f1 !=null){
try {
f1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (accept!=null){
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}