网络编程
三要素
IP :设备在网络中的地址,是唯一的标识
端口号 :应用程序在设备中唯一的标识。
协议 :数据在网络中传输的规则 常见的协议有UDP、TCP、http、https、ftp
IP
端口 网络的通信,本质上是两个应用程序的通信。如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识
协议 计算机网络中,连接和通信的规则被称为网络通信协议
InetAddress
方法
描述
static InetAddress getByName(String hast)
确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
String getHostName()
获取此iP地址的主机名
String getHostAddress()
返回文本显示中的IP地址字符串
InetAddress name = InetAddress.getByName("LAPTOP-JFOBLQKV" );String hostName = name.getHostName();String hostAddress = name.getHostAddress();
UDP通信
发送数据
1、创建DatagramSocket对象
2、打包数据
3、发送数据
4、释放
DatagramSocket datagramSocket = new DatagramSocket ();String str = "辰学UDP" ;byte [] bytes = str.getBytes();InetAddress byAddress = InetAddress.getByName("127.0.0.1" );int port = 10086 ;DatagramPacket datagramPacket = new DatagramPacket (bytes, bytes.length, byAddress, port);datagramSocket.send(datagramPacket); datagramSocket.close();
接收数据
1、创建DatagramSocket对象
2、打包数据
3、发送数据
4、释放
DatagramSocket datagramSocket = new DatagramSocket (10086 );byte [] bytes = new byte [1024 ];DatagramPacket datagramPacket = new DatagramPacket (bytes, bytes.length); datagramSocket.receive(datagramPacket); byte [] data = datagramPacket.getData();System.out.println("接收的数据:" +new String (data,0 ,datagramPacket.getLength())); InetAddress address = datagramPacket.getAddress(); int port = datagramPacket.getPort();
简易聊天室
DatagramSocket datagramSocket = new DatagramSocket ();Scanner scanner = new Scanner (System.in);while (true ){ System.out.print("输入消息:" ); String str = scanner.next(); byte [] bytes = str.getBytes(); InetAddress name = InetAddress.getByName("127.0.0.1" ); int host = 10089 ; DatagramPacket datagramPacket = new DatagramPacket (bytes, bytes.length,name,host); datagramSocket.send(datagramPacket); if (str.equals("886" )){ break ; } } datagramSocket.close();
DatagramSocket datagramSocket = new DatagramSocket (10089 );byte [] bytes = new byte [1024 ];DatagramPacket datagramPacket = new DatagramPacket (bytes, bytes.length);while (true ){ datagramSocket.receive(datagramPacket); byte [] data = datagramPacket.getData(); System.out.println("接收到的数据:" +new String (data,0 ,datagramPacket.getLength())); if (new String (data,0 ,datagramPacket.getLength()).equals("886" )){ break ; } } datagramSocket.close();
三种通信方式
MulticastSocket multicastSocket = new MulticastSocket ();InetAddress byAddress = InetAddress.getByName("127.0.0.1" );
MulticastSocket multicastSocket = new MulticastSocket (端口);InetAddress name = InetAddress.getByName("127.0.0.1" );datagramSocket.joinGroup(name);
广播:把目标地址改为:255.255.255.255 ==> 局域网全部都可接收到数据
TCP通信
服务端一开始等待连接,当客户端连接上后断开连接,服务端也会自动停止
Socket socket = new Socket ("127.0.0.1" , 1112 );PrintStream printStream = new PrintStream (socket.getOutputStream(),true , "UTF-8" );printStream.printf("你好" ); socket.close();
ServerSocket serverSocket = new ServerSocket (1112 );Socket accept = serverSocket.accept();InputStream inputStream = accept.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader (inputStream);int read;while ((read=inputStreamReader.read())!=-1 ){ System.out.println((char ) read); } serverSocket.close();
三次握手
四次挥手
TCP练习 1、
Socket socket = new Socket ("127.0.0.1" , 1201 );OutputStream outputStream = socket.getOutputStream();Scanner scanner = new Scanner (System.in);while (true ){ String str = scanner.next(); outputStream.write(str.getBytes()); if (str.equals("886" )){ break ; } } socket.close(); ServerSocket serverSocket = new ServerSocket (1201 );Socket accept = serverSocket.accept();InputStream inputStream = accept.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader (inputStream);int read;while ((read=inputStreamReader.read())!=-1 ){ System.out.println((char ) read); } serverSocket.close();
2、
Socket socket = new Socket ("127.0.0.1" , 1202 );OutputStream outputStream = socket.getOutputStream();outputStream.write("你好!" .getBytes()); socket.shutdownOutput(); InputStream inputStream = socket.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader (inputStream);int read;while ((read=inputStreamReader.read())!=-1 ){ System.out.println((char ) read); } socket.close();
ServerSocket serverSocket = new ServerSocket (1202 );Socket accept = serverSocket.accept();InputStream inputStream = accept.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader (inputStream);int read;while ((read=inputStreamReader.read())!=-1 ){ System.out.println((char ) read); } OutputStream outputStream = accept.getOutputStream();outputStream.write("你也好呀!" .getBytes()); accept.close(); serverSocket.close();
3、
Socket socket = new Socket ("127.0.0.1" , 1203 );BufferedInputStream bufferedInputStream = new BufferedInputStream (new FileInputStream ("D:\\1.JavaRoute\\Java\\TCP\\A\\cc.jpg" ));BufferedOutputStream bufferedOutputStream = new BufferedOutputStream (socket.getOutputStream());int read;byte [] bytes = new byte [1024 ];while ((read=bufferedInputStream.read(bytes))!=-1 ){ bufferedOutputStream.write(bytes,0 ,read); } socket.shutdownOutput(); BufferedReader bufferedReader = new BufferedReader (new InputStreamReader (socket.getInputStream()));String s = bufferedReader.readLine();System.out.println(s); socket.close();
ServerSocket serverSocket = new ServerSocket (1203 );Socket accept = serverSocket.accept();BufferedInputStream bufferedInputStream = new BufferedInputStream (accept.getInputStream());BufferedOutputStream bufferedOutputStream = new BufferedOutputStream (new FileOutputStream ("D:\\1.JavaRoute\\Java\\TCP\\B\\cc.jpg" ));byte [] bytes = new byte [1024 ];int read;while ((read=bufferedInputStream.read(bytes))!=-1 ){ bufferedOutputStream.write(bytes,0 ,read); } BufferedWriter bufferedWriter = new BufferedWriter (new OutputStreamWriter (accept.getOutputStream()));bufferedWriter.write("上传成功" ); bufferedWriter.newLine(); bufferedWriter.flush(); accept.close(); serverSocket.close();
public class ThreadDemo3 implements Runnable { private Socket accept; public ThreadDemo3 (Socket socket) { this .accept = socket; } @Override public void run () { try { String replace = UUID.randomUUID().toString().replace("-" , "" ); BufferedInputStream bufferedInputStream = new BufferedInputStream (accept.getInputStream()); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream (new FileOutputStream ("D:\\1.JavaRoute\\Java\\TCP\\B\\" +replace+".jpg" )); int read; byte [] bytes = new byte [1024 ]; while ((read=bufferedInputStream.read(bytes))!=-1 ){ bufferedOutputStream.write(bytes,0 ,read); } BufferedWriter bufferedWriter = new BufferedWriter (new OutputStreamWriter (accept.getOutputStream())); bufferedWriter.write("上传成功" ); bufferedWriter.newLine(); bufferedWriter.flush(); } catch (IOException e) { throw new RuntimeException (e); } finally { if (accept!=null ){ try { accept.close(); } catch (IOException e) { throw new RuntimeException (e); } } } } }
ServerSocket serverSocket = new ServerSocket (1203 );ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor ( 2 , 5 , 2 , TimeUnit.SECONDS, new ArrayBlockingQueue <>(3 ), Executors.defaultThreadFactory(), new ThreadPoolExecutor .AbortPolicy() ); while (true ){ Socket accept = serverSocket.accept(); threadPoolExecutor.submit(new ThreadDemo3 (accept)); }