Day38 网络编程(了解即可)
1. 计算机网络
2. 网络编程
3. 网络模型
4. 网络编程三要素
4.1. IP地址
4.2. 端口号
4.3. 网络协议
5. InetAddress类
public class Test01 {
public static void main(String[] args) throws UnknownHostException {
InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : allByName) {
System.out.println(inetAddress);
}
}
}
6. Socket
7. TCP编程
7.1. 简单的TCP通信
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8080);
Socket socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
String readLine = br.readLine();
System.out.println(readLine);
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("18号技师:今年18岁");
br.close();
ps.close();
server.close();
}
}
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 8080);
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("巴得伟:小妹妹,你多大了?");
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
String readLine = br.readLine();
System.out.println(readLine);
ps.close();
br.close();
socket.close();
}
}
7.2 TCP案例
7.2.1 传输文件
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8080);
Socket socket = server.accept();
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.mp4"));
byte[] bs = new byte[1024];
int len;
while((len = bis.read(bs)) != -1){
bos.write(bs, 0, len);
}
bis.close();
bos.close();
server.close();
}
}
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 8080);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("视频.mp4"));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] bs = new byte[1024];
int len;
while((len = bis.read(bs)) != -1){
bos.write(bs, 0, len);
}
bis.close();
bos.close();
socket.close();
}
}
7.2.2 单聊
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8080);
Socket socket = server.accept();
new ReceiveThread(socket).start();
Scanner scan = new Scanner(System.in);
PrintStream ps = new PrintStream(socket.getOutputStream());
while(true){
ps.println("18号技师:" + scan.next());
}
}
}
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 8080);
new ReceiveThread(socket).start();
Scanner scan = new Scanner(System.in);
PrintStream ps = new PrintStream(socket.getOutputStream());
while(true){
ps.println("巴得伟:" + scan.next());
}
}
}
public class ReceiveThread extends Thread{
private Socket socket;
public ReceiveThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
while(true){
String readLine = br.readLine();
System.out.println(readLine);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
7.2.3 群聊
public class Server {
public static final ConcurrentHashMap<String, PrintStream> map = new ConcurrentHashMap<>();
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8080);
while(true){
Socket socket = server.accept();
String ip = socket.getInetAddress().toString();
PrintStream ps = new PrintStream(socket.getOutputStream());
map.put(ip, ps);
new ServerThread(socket).start();
}
}
}
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 8080);
new ReceiveThread(socket).start();
Scanner scan = new Scanner(System.in);
PrintStream ps = new PrintStream(socket.getOutputStream());
while(true){
ps.println("巴得伟:" + scan.next());
}
}
}
public class ReceiveThread extends Thread{
private Socket socket;
public ReceiveThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
while(true){
String readLine = br.readLine();
System.out.println(readLine);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ServerThread extends Thread{
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
while(true){
String readLine = br.readLine();
System.out.println(readLine);
Set<Entry<String,PrintStream>> entrySet = Server.map.entrySet();
for (Entry<String, PrintStream> entry : entrySet) {
String ip = entry.getKey();
PrintStream ps = entry.getValue();
if(!socket.etInetAddress().toString().equals(ip)){
ps.println(readLine);
}
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
8.TCP三次握手 和 四次挥手
9. UDP编程
9.1 简单的UDP通信
public class Client01 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(7070);
byte[] buf = "用良心做教育".getBytes();
DatagramPacket p = new DatagramPacket(buf , 0, buf.length, InetAddress.getByName("127.0.0.1"), 8080);
socket.send(p);
buf = new byte[1024];
p = new DatagramPacket(buf , buf.length);
socket.receive(p);
System.out.println(new String(buf).trim());
socket.close();
}
}
public class Client02 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8080);
byte[] buf = new byte[1024];
DatagramPacket p = new DatagramPacket(buf , buf.length);
socket.receive(p);
System.out.println(new String(buf).trim());
buf = "做真实的自己".getBytes();
p = new DatagramPacket(buf , 0, buf.length, InetAddress.getByName("127.0.0.1"), 7070);
socket.send(p);
socket.close();
}
}
9.2 UDP案例 之 单聊
public class Client01 {
public static void main(String[] args) throws SocketException {
DatagramSocket socket = new DatagramSocket(7070);
new ReceiveThread(socket).start();
new SendThread("巴得伟", "127.0.0.1", 8080, socket).start();
}
}
public class Client02 {
public static void main(String[] args) throws SocketException {
DatagramSocket socket = new DatagramSocket(8080);
new ReceiveThread(socket).start();
new SendThread("王益升", "127.0.0.1", 7070, socket).start();
}
}
public class ReceiveThread extends Thread{
private DatagramSocket socket;
public ReceiveThread(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
while(true){
byte[] buf = new byte[1024];
DatagramPacket p = new DatagramPacket(buf , buf.length);
try {
socket.receive(p);
System.out.println(new String(buf).trim());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class SendThread extends Thread{
private String nickName;
private String ip;
private int port;
private DatagramSocket socket;
public SendThread(String nickName, String ip, int port, DatagramSocket socket) {
this.nickName = nickName;
this.ip = ip;
this.port = port;
this.socket = socket;
}
@Override
public void run() {
Scanner scan = new Scanner(System.in);
while(true){
byte[] buf = (nickName + ":" + scan.next()).getBytes();
try {
DatagramPacket p = new DatagramPacket(buf, buf.length, InetAddress.getByName(ip), port);
socket.send(p);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
9.3 TCP VS UDP
比较 | TCP | UDP |
---|
是否连接 | 面向连接 | 无面向连接 |
传输可靠性 | 可靠 | 不可靠 |
应用场合 | 传输大量数据 | 少量数据 |
速度 | 慢 | 快 |
10.HTTP
10.1 需求:获取淘宝商品周边类别
public class Test01 {
public static void main(String[] args) throws IOException {
String path = "https://suggest.taobao.com/sug?code=utf-8&q=%E8%80%90%E5%85%8B&callback=cb";
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
int code = connection.getResponseCode();
if(code == HttpURLConnection.HTTP_OK){
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
char[] cs = new char[1024];
int len;
while((len = br.read(cs)) != -1){
System.out.println(new String(cs, 0, len));
}
}else if(code == HttpURLConnection.HTTP_NOT_FOUND){
System.out.println("页面未找到");
}
}
}
10.2 需求:下载图片
public class Test02 {
public static void main(String[] args) throws IOException {
String path = "https://wx2.sinaimg.cn/mw690/e2438f6cly1hoo3qpm7vrj21111jk4mn.jpg";
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
int code = connection.getResponseCode();
if(code == HttpURLConnection.HTTP_OK){
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("金智媛.jpg"));
byte[] bs = new byte[1024];
int len;
while((len = bis.read(bs)) != -1){
bos.write(bs, 0, len);
}
bis.close();
bos.close();
}else if(code == HttpURLConnection.HTTP_NOT_FOUND){
System.out.println("页面未找到");
}
}
}