文章目录
- 基本的通信架构
- CS
- BS
- 网络通信三要素
- IP地址
- 端口号
- 协议
- 传输层的两个通信协议(UDP和TCP)
- CS
- UDP通信
- TCP通信
- CS架构(群聊)
- BS
基本的通信架构
CS
BS
网络通信三要素
IP地址
IP地址的代表类是谁?
InetAddress类如何获取本机IP对象
public static InetAddress getLocalHost()如何判断与该IP地址对象是否互通?
public boolean isReachable(int timeout)
端口号
唯一标识正在计算机设备上运行的进程(程序)
协议
传输层的两个通信协议(UDP和TCP)
TCP通信协议的特点是什么样的?
它是一种面向连接的可靠通信协议。
传输前,采用“三次握手”方式建立连接,点对点的通信,所以可靠。
在连接中可进行大数据量的传输。 通信效率较低。
UDP协议的特点是什么
- 用户数据报协议(User Datagram Protocol)
- UDP是面向无连接,不可靠传输的通信协议。
- 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据
CS
UDP通信
客户端
服务端
TCP通信
客户端
TCP通信,客户端的代表类是谁?
Socket类
public Socket(String host , int port)
TCP通信,如何使用Socket管道发送、接收数据 ?
OutputStream getOutputStream():获得字节输出流对象(发)
InputStream getInputStream():获得字节输入流对象(收)
服务端
服务端实现步骤
创建ServerSocket对象,注册服务端端口。
调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
释放资源:关闭socket管道
CS架构(群聊)
端口转发
Client
package TCP; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.*; import java.util.Scanner; public class Client { static void main() throws IOException { InetAddress ip1=InetAddress.getLocalHost(); System.out.println(ip1); Socket socket=new Socket(ip1,8888); Scanner sc=new Scanner(System.in); OutputStream os=socket.getOutputStream(); DataOutputStream dos=new DataOutputStream(os); new ClientReader_Thread(socket).start(); while (true) { String msg=sc.nextLine(); if(msg.equals("exit")){ System.out.println("退出了客户端,欢迎下次光临"); break; } dos.writeUTF(msg); } dos.close(); socket.close(); } }ClientReader
package TCP; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; public class ClientReader_Thread extends Thread{ private Socket socket; public ClientReader_Thread(Socket socket){ this.socket=socket; } @Override public void run() { InputStream is = null; try { is = socket.getInputStream(); } catch (IOException e) { throw new RuntimeException(e); } DataInputStream dis = new DataInputStream(is); while (true) { try { String msg = dis.readUTF(); System.out.println(msg); System.out.println("————————————"); } catch (IOException e) { System.out.println("自己下线了"+socket.getRemoteSocketAddress()); break; } } } }Server
package TCP; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class Server { public static ArrayList<Socket> onlineSockets=new ArrayList<>(); static void main() throws IOException { System.out.println("服务端已启动"); ServerSocket serverSocket= new ServerSocket(8888); while (true) { Socket socket=serverSocket.accept(); onlineSockets.add(socket); System.out.println("有人上线了"+socket.getRemoteSocketAddress()); SeverReader_Thread thread=new SeverReader_Thread(socket); thread.start(); } } }ServerReader
package TCP; import java.io.*; import java.net.Socket; public class SeverReader_Thread extends Thread{ private Socket socket; public SeverReader_Thread(Socket socket){ this.socket=socket; } @Override public void run() { InputStream is = null; try { is = socket.getInputStream(); } catch (IOException e) { throw new RuntimeException(e); } DataInputStream dis = new DataInputStream(is); while (true) { try { String msg = dis.readUTF(); System.out.println(msg); sendToall(msg); System.out.println("————————————"); } catch (IOException e) { System.out.println("有人下线了"+socket.getRemoteSocketAddress()); Server.onlineSockets.remove(socket); break; } } } private void sendToall(String msg) throws IOException { for (Socket onlineSocket : Server.onlineSockets) { OutputStream os=onlineSocket.getOutputStream(); DataOutputStream dos=new DataOutputStream(os); dos.writeUTF(msg); dos.flush(); } } }BS
package BS; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Server { static void main() throws IOException { InetAddress ip1=InetAddress.getLocalHost(); System.out.println(ip1); ServerSocket serverSocket=new ServerSocket(1145); while (true) { Socket socket=serverSocket.accept(); System.out.println(socket.getRemoteSocketAddress()); new ServerReader_Thread(socket).start(); } } }package BS; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class ServerReader_Thread extends Thread{ Socket socket=new Socket(); public ServerReader_Thread(Socket socket){ this.socket=socket; } @Override public void run(){ OutputStream os= null; try { os = socket.getOutputStream(); } catch (IOException e) { throw new RuntimeException(e); } PrintWriter printWriter=new PrintWriter(os); printWriter.println("HTTP/1.1 200 OK"); printWriter.println("Content-Type: text/html; charset=UTF-8"); printWriter.println(); printWriter.println("<div>王顺喜欢玩galgame<div>"); printWriter.flush(); try { socket.close(); } catch (IOException e) { throw new RuntimeException(e); } } }