文章目录
一.网络通信概念
1.网络通信
2.网络
3.ip地址
4.域名和端口
通过ping指令可以查询对应域名的ip
5.网络协议
人类语言的本身也是一种协议!
6.TCP和UDP
7.Socket
二.代码
1.InetAddress
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @author ZHR
* @version 1.0
**/
public class InetAddress_ {
public static void main(String[] args) throws UnknownHostException {
//1.获取本机的InetAddress对象
System.out.println(InetAddress.getLocalHost());//DESKTOP-9GPVRSO/10.165.181.208
//2.根据指定主机名获取InetAddress对象
System.out.println(InetAddress.getByName("DESKTOP-9GPVRSO"));//DESKTOP-9GPVRSO/10.165.181.208
//3.根据域名获取InetAddress对象
System.out.println(InetAddress.getByName("www.baidu.com"));//www.baidu.com/180.101.49.12
//4.通过InetAddress对象获取对应IP地址
System.out.println(InetAddress.getByName("www.baidu.com").getHostAddress());//180.101.49.12
//5.通过InetAddress对象获取对应的主机名
System.out.println(InetAddress.getLocalHost().getHostName());//DESKTOP-9GPVRSO
}
}
2.TCP网络编程
字节流编程
服务端代码:
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author ZHR
* @version 1.0
**/
public class Server {
public static void main(String[] args) throws IOException {
//1.在本机 端口9999监听 ,等待连接
//细节:要求本机没有其他服务器监听9999端口
ServerSocket serverSocket = new ServerSocket(9999);
//2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回一个socket对象
//这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
Socket socket = serverSocket.accept();
//3.接收服务器传的数据,显示数据
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int readLen = 0;
while((readLen = inputStream.read(buf))!=-1){
System.out.println(new String(buf,0,readLen));
}
//4.向服务端发送数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello client".getBytes());
socket.shutdownOutput();
//5.关闭流和socket
socket.close();
inputStream.close();
outputStream.close();
serverSocket.close();
}
}
客户端代码:
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author ZHR
* @version 1.0
**/
public class Server {
public static void main(String[] args) throws IOException {
//1.在本机 端口9999监听 ,等待连接
//细节:要求本机没有其他服务器监听9999端口
ServerSocket serverSocket = new ServerSocket(9999);
//2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回一个socket对象
//这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
Socket socket = serverSocket.accept();
//3.接收服务器传的数据,显示数据
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int readLen = 0;
while((readLen = inputStream.read(buf))!=-1){
System.out.println(new String(buf,0,readLen));
}
//4.向服务端发送数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello client".getBytes());
socket.shutdownOutput();
//5.关闭流和socket
socket.close();
inputStream.close();
outputStream.close();
serverSocket.close();
}
}
注意!
需要用socket.shutdownOutput() 提示已经发送完成
字符流编程
注意!!!!!!
1.字符流写的时候需要手动刷新!!!! flush!!
2. bufferedWriter.newLine() 表示写入内容结束,相当于socket.shutdownOutput() ,但是要求对方使用readline()方法接受!
3.需要用转换流进行转换
服务端代码:
package zijieliu;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author ZHR
* @version 1.0
**/
public class Server {
public static void main(String[] args) throws IOException {
//1.在本机 端口9999监听 ,等待连接
//细节:要求本机没有其他服务器监听9999端口
ServerSocket serverSocket = new ServerSocket(9999);
//2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回一个socket对象
//这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
Socket socket = serverSocket.accept();
//3.接收服务器传的数据,显示数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//需要用readline()方法读
System.out.println(bufferedReader.readLine());
//4.向服务端发送数据
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write("hello client");
bufferedWriter.newLine();
bufferedWriter.flush();
//socket.shutdownOutput();
//5.关闭流和socket
socket.close();
bufferedWriter.close();
bufferedReader.close();
serverSocket.close();
}
}
客户端代码:
package zijieliu;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @author ZHR
* @version 1.0
**/
public class Client {
public static void main(String[] args) throws IOException {
//客户端发送hello server送给服务端
//1.连接服务器(服务器ip,端口),连接本机的9999端口
Socket socket = new Socket(InetAddress.getLocalHost(),9999);
//2.连接上后,得到和该socket关联的输出流,通过该流发送内容
//使用字符流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write("hello server");
bufferedWriter.newLine();//表示写入内容结束,要求对方使用readline()方法读!
bufferedWriter.flush();
//提示已经发送完成
//socket.shutdownOutput();
//3.接受服务端发送的数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(bufferedReader.readLine());
//4.关闭流和socket
bufferedReader.close();
bufferedWriter.close();
socket.close();
}
}
上传文件
采取边读边写的方法
客户端代码:
//提供端口
ServerSocket serverSocket = new ServerSocket(8888);
//接受socket
Socket socket = serverSocket.accept();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src/copy.jpg"));
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
//边读边写
byte[] buf = new byte[1024];
int readLen = 0;
while((readLen = bis.read(buf))!=-1){
bos.write(buf,0,readLen);
bos.flush();
}
//关闭流
serverSocket.close();
socket.close();
bos.close();
bis.close();
客户端代码:
//连接服务端
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
//设置客户端传入文件的路径
String filePath = "c:/io/copy.jpg";
//讲数据送到通路,边读边写
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
int readLen = 0;
byte[] buf = new byte[1024];
while((readLen = bis.read(buf))!=-1){
bos.write(buf,0,readLen);
bos.flush();
}
//告诉客户端已经写完
socket.shutdownOutput();
//关闭流
bos.close();
bis.close();
socket.close();
3.netstat
4.UDP网络编程
发送端代码:
package UDP;
import java.io.IOException;
import java.net.*;
/**
* @author ZHR
* @version 1.0
**/
public class Server {
public static void main(String[] args) throws IOException {
//1.创建 DatagramSocket 对象,准备在9998端口数据 接受/发送数据
DatagramSocket socket = new DatagramSocket(9998);
//2.讲需要发送的数据封装到DatagramPacket对象
byte[] data = "明天吃火锅吗".getBytes();
//new DatagramPacket(byte内容数组,数组长度,ip地址,端口)
DatagramPacket packet =
new DatagramPacket(data,data.length, InetAddress.getByName("10.165.181.208"),9999);
//3.发送数据
socket.send(packet);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
socket.receive(receivePacket);
int length = receivePacket.getLength();
receiveData = receivePacket.getData();
System.out.println(new String(receiveData,0,length));
socket.close();
}
}
接收端代码:
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @author ZHR
* @version 1.0
**/
public class Client {
public static void main(String[] args) throws IOException {
//1.创建一个 DatagramSocket 对象,在9999端口接受对象
DatagramSocket socket = new DatagramSocket(9999);
//2.创建一个 DatagramPacket 对象 , 准备接收数据
// UDP中,一个数据包最大传送的大小为64k
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
//3.调用接收方法,讲网络上传输的 DatagramPacket 对象填充到 socket对象
// 当有数据包发送到本机的9999端口时,就会接收到数据,否则,就会阻塞等待
socket.receive(packet);
//4.讲packet进行拆包,取出数据,并提示
int length = packet.getLength();
byte[] data = packet.getData();
System.out.println(new String(data,0,length));
byte[] dataSend = "收到".getBytes();
DatagramPacket sendPacket =
new DatagramPacket(dataSend,dataSend.length, InetAddress.getLocalHost(),9998);
socket.send(sendPacket);
socket.close();
}
}