这里写目录标题

  • 网络编程
    • 网络通信
    • 网络
    • ip地址
      • ipv4地址分类
    • 域名
    • 端口号
    • 网络通信协议
      • TCP和UDP
        • TCP协议:传输控制协议
        • UDP协议
    • InetAddress类
      • 相关方法
      • 代码示例
    • Socket
      • 基本介绍
    • TCP网络通信编程
      • 基本介绍
      • 练习1
      • 练习2
      • 练习3
        • 方法一:socket.shutdownOutput()写
        • 方法二:bufferedWriter.newLine()写
      • 练习4
    • netstat指令
    • TCP网络不为人知的秘密
  • UDP网络通信编程(了解)
    • 基本介绍
    • 示意图
    • 基本流程
    • 课后练习
      • 练习1
    • 课后作业
      • 作业1普通版
      • 作业1升级版
    • 作业2
    • 作业3

网络编程

网络通信

  1. 概念:两台设备之间通过网络实现数据传递
  2. 网络通信:将数据通过网络从一台设备传输到另一台设备
  3. java.net包下提供了一系列的类或者接口,供程序员完成网络通讯。

网络

  1. 概念:两台或者多台设备通过一定物理设备连接起来构成了网络
  2. 根据网络的覆盖范围不同,对网络进行分类:
    局域网:覆盖范围最小,仅仅覆盖了一个教室或者一个机房
    城域网:覆盖范围较大,可以覆盖一个城市
    广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表

ip地址

  1. 概念:用于唯一标识网络中的每台计算机/主机
  2. 查看ip地址:ipconfig
  3. ip地址的表示形式:点分十进制 XX.XX.XX.XX
  4. 每一个十进制数的范围:0~255
  5. ip地址的组成:网络地址+主机地址,比如192.169.12.69
  6. IPv6是互联网工程任务组设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为地球上的每一粒沙子编上一个地址
  7. 由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展IPv6的使用,不仅能解决网络地址资源数量的问题,而且还解决了多种设备接入互联网的障碍。
  8. IPv4 :4个字节 IPv6:16个字节

ipv4地址分类

域名

  1. www.baidu.com
  2. 好处:方便记忆,解决记ip的困难
  3. 概念:将ip地址映射成域名

端口号

  1. 概念:用于表示计算机上某个特定的网络程序
  2. 表示形式:以整数形式,范围0~65535 (2个字节)
  3. 0~1024已经被占用,比如ssh 22,ftp 21,smtp 25,http 80
  4. 常间的网络程序端口
    tomcat:8080
    mysql:3306
    oracle:1521
    sqlserver:1433

网络通信协议

协议(tcp/ip)
TCP/IP中文译名为传输控制协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成。

TCP和UDP

TCP协议:传输控制协议

  1. 使用TCP协议前,预先建立TCP连接,形成传输数据通道
  2. 传输前,采用"三次握手"方式,是可靠的
  3. TCP协议进行通信的两个应用进程:客户端、服务端
  4. 在连接中可进行最大数据量的传输
  5. 传输完毕,需要释放自己建立的连接,效率低

UDP协议

  1. 将数据、源、目的封装成数据包,不需要建立连接
  2. 每个数据报的大小限制在64K以内
  3. 因无需连接,故是不可靠
  4. 发送数据结束时无需释放资源(因为不是面向连接的),速度快
  5. 举例:厕所通知:发短信

InetAddress类

相关方法

  1. 获取本机InetAddress对象,getLocalHost
  2. 根据指定主机名、域名获取ip地址对象,getByName
  3. 获取InetAddress对象的主机名 getHostName
  4. 获取InetAddress对象的地址 getHostAddress

代码示例

package InetAddressUse;import org.junit.Test;import java.lang.annotation.Target;
import java.net.InetAddress;
import java.net.UnknownHostException;/*** @author wty* @date 2022/10/23 18:00*/
public class InetAddressUse {@Testpublic void InetUse() throws UnknownHostException {/*** 1. 获取本机InetAddress对象,getLocalHost* 2. 根据指定主机名、域名获取ip地址对象,getByName* 3. 获取InetAddress对象的主机名 getHostName* 4. 获取InetAddress对象的地址 getHostAddress*/InetAddress localHost = InetAddress.getLocalHost();System.out.println(localHost); // 获取 计算机名+本机的ip MagicBook15-wty/192.168.12.1 老韩IPInetAddress byName = InetAddress.getByName("MagicBook15-wty");// 根据机器名称获取InetAddress对象System.out.println(byName);// 根据域名获取到InetAddress对象InetAddress baidu = InetAddress.getByName("www.baidu.com");System.out.println(baidu);// 通过InetAddress对象,获取主机地址String ipHost = baidu.getHostAddress();System.out.println("ipHost 对应的主机地址是;" + ipHost);// 通过InetAddress对象,获取主机名/域名String nameHost = baidu.getHostName();System.out.println("ipHost 对应的主机域名是;" + nameHost);String name = localHost.getHostName();System.out.println("localHost对应的主机名是:" + name);}
}

Socket

基本介绍

  1. 套接字(Socket)开发网络应用程序被广泛采用,以至于称为事实上的标准。
  2. 通信的两端都要有Socket,是两台机器间通信的端点
  3. 网络通信其实就是Socket间的通信
  4. Socket允许程序把网络连成一个流,数据在两个Socket间通过IO传输。
  5. 一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。

TCP网络通信编程

基本介绍

  1. 基于客户端——服务端的网络通信
  2. 底层使用的是TCP/IP协议
  3. 应用场景举例:客户端发送数据,服务端接收并显示
  4. 基于Socket的TCP编程

练习1


客户端代码示例:

package SocketServerandClient;import org.junit.Test;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;/*** @author wty* @date 2022/10/23 19:07* 客户端*/
public class Client {@Testpublic void getClientFun() throws IOException {// 1.连接服务器 ip, 端口号Socket socket = new Socket(InetAddress.getLocalHost(), 9999);// 如果连接成功返回Socket对象System.out.println("客户端Socket对象的运行类型是:" + socket.getClass());// 2.连接上之后,生成Socket通过 socket.getOutputStream()// 得到和Socket 对象关联的 输出流对象// 3.通过输出流,写入数据到数据通道OutputStream outputStream = socket.getOutputStream();outputStream.write("hello,server".getBytes());// 关闭流和Soceket对象outputStream.close();socket.close();System.out.println("客户端退出");}
}

服务器端代码示例:

package SocketServerandClient;import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* 服务器端*/
public class ServerSocketExercise {@Testpublic void serverSocketFun() throws IOException {// 在本机999端口监听,等待连接// 要求本机9999端口没有被占用// ServerSocket可以通过accept()返回多个Socket,可以用于并发ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务器端在9999端口监听,等待连接中…………");// 当没有客户端连接9999端口时,程序会阻塞,等待连接// 如果有客户端连接的话,会返回一个Socket对象Socket accept = serverSocket.accept();System.out.println("socket的运行类型:" + accept.getClass());// 通过socket.getInputStream()读取客户端写入数据通道的数据InputStream inputStream = accept.getInputStream();byte[] bytes = new byte[8];int count = 0;while ((count = inputStream.read(bytes)) != -1){System.out.print(new String(bytes,0,count));}accept.close();inputStream.close();serverSocket.close();}
}

练习2


客户端:

package SocketServerandClient;import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/23 19:56*/
public class ClientHomeWork02 {@Testpublic void getClientHomeWork02() throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(), 9999);OutputStream outputStream = socket.getOutputStream();outputStream.write("hello server".getBytes());socket.shutdownOutput();InputStream inputStream = socket.getInputStream();int count = 0;byte[] bytes = new byte[8];System.out.println("客户端接收到来自服务器端返回的指令:");while ((count = inputStream.read(bytes)) != -1) {System.out.print(new String(bytes, 0, count));}System.out.println();socket.close();outputStream.close();inputStream.close();System.out.println("客户端退出");}
}

服务端

package SocketServerandClient;import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/23 19:56*/
public class ServerHomeWork02 {@Testpublic void getServerHomeWork02() throws IOException {ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务器端在9999端口等待监听…………");Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();int count = 0;byte[] bytes = new byte[8];System.out.println("服务器端接收到数据消息为:");while ((count = inputStream.read(bytes))!= -1){System.out.print(new String(bytes,0,count));}System.out.println();OutputStream outputStream = socket.getOutputStream();outputStream.write("hello client".getBytes());socket.shutdownOutput();serverSocket.close();socket.close();inputStream.close();outputStream.close();System.out.println("服务器端退出");}
}

练习3

方法一:socket.shutdownOutput()写

客户端

package SocketServerandClient;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;/*** @author wty* @date 2022/10/23 22:56** 客户端 字符流*/
public class ClientHomeWork03 {@Testpublic void getClientHomeWork03() throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(), 9999);BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("hello server");// 字符流必须刷新!!!!!!!!!bufferedWriter.flush();socket.shutdownOutput(); // !!!!注意必须放在flush下面关闭BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String str = "";System.out.println("客户端接收到来自服务端发送的信息:");while ((str = bufferedReader.readLine())!= null){System.out.println(str);}// 流是后打开的先关闭socket.close();bufferedReader.close();bufferedWriter.close();System.out.println("客户端结束");}
}

服务端

package SocketServerandClient;import org.junit.Test;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/23 22:55** 服务端 字符流*/
public class ServerHomeWork03 {@Testpublic void getServerHomeWork03() throws IOException {ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端等待9999端口监听中……………………");Socket socket = serverSocket.accept();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String str = "";System.out.println("服务端接收到来自客户端发送的信息:");while ((str = bufferedReader.readLine())!= null){System.out.println(str);}BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("hello,client");// 字符流必须刷新!!!!!!!!!bufferedWriter.flush();socket.shutdownOutput(); // 注意必须放在flush()后面关闭serverSocket.close();socket.close();bufferedWriter.close();bufferedReader.close();System.out.println("服务端结束");}
}

方法二:bufferedWriter.newLine()写

客户端

package SocketServerandClient;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;/*** @author wty* @date 2022/10/23 22:56** 客户端 字符流*/
public class ClientHomeWork03 {@Testpublic void getClientHomeWork03() throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(), 9999);BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("hello server");// 结束标记 == socket.shutdownOutput();bufferedWriter.newLine(); // 要求对方读取的时候要用readLine()// 字符流必须刷新!!!!!!!!!bufferedWriter.flush();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String str = "";/** // 因为下面用了bufferedWriter.newLine()*  // 这里再循环就是错误的了**         while ((str = bufferedReader.readLine())!= null){*             System.out.println(str);*         }*/System.out.println("客户端接收到来自服务端发送的信息:");str = bufferedReader.readLine();System.out.println(str);// 流是后打开的先关闭socket.close();bufferedReader.close();bufferedWriter.close();System.out.println("客户端结束");}
}

服务器端

package SocketServerandClient;import org.junit.Test;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/23 22:55** 服务端 字符流*/
public class ServerHomeWork03 {@Testpublic void getServerHomeWork03() throws IOException {ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端等待9999端口监听中……………………");Socket socket = serverSocket.accept();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String str = "";System.out.println("服务端接收到来自客户端发送的信息:");/** // 因为下面用了bufferedWriter.newLine()*  // 这里再循环就是错误的了**         while ((str = bufferedReader.readLine())!= null){*             System.out.println(str);*         }*/str = bufferedReader.readLine();System.out.println(str);BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("hello,client");// 结束标记 == socket.shutdownOutput();// 要求对方读取的时候要用readLine(),// 并且使用了newLine后上面str = bufferedReader.readLine()不能循环bufferedWriter.newLine();// 字符流必须刷新!!!!!!!!!bufferedWriter.flush();serverSocket.close();socket.close();bufferedWriter.close();bufferedReader.close();System.out.println("服务端结束");}
}

练习4


韩老师的工具类

package SocketServerandClient;import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;/*** 此类用于演示关于流的读写方法**/
public class StreamUtils {/*** 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]* @param is* @return* @throws Exception*/public static byte[] streamToByteArray(InputStream is) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象byte[] b = new byte[1024];//字节数组int len;while((len=is.read(b))!=-1){//循环读取bos.write(b, 0, len);//把读取到的数据,写入bos }byte[] array = bos.toByteArray();//然后将bos 转成字节数组bos.close();return array;}/*** 功能:将InputStream转换成String* @param is* @return* @throws Exception*/public static String streamToString(InputStream is) throws Exception{BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder builder= new StringBuilder();String line;while((line=reader.readLine())!=null){builder.append(line+"\r\n");}return builder.toString();}}

客户端

package SocketServerandClient;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;/*** @author wty* @date 2022/10/24 0:01* 客户端*/
public class ClientHomeWork05 {@Testpublic void getClientHomeWork05() throws Exception {// 读取E盘中的图片String path = "E:\\wb.png";BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path));// 用工具类转换成byte数组byte[] bytes = StreamUtils.streamToByteArray(new FileInputStream(path));Socket socket = new Socket(InetAddress.getLocalHost(), 9999);// 用socket传递给传输通道BufferedOutputStream bufferedOutputStream =  new BufferedOutputStream(socket.getOutputStream());bufferedOutputStream.write(bytes);socket.shutdownOutput();System.out.println("客户端发送图片成功!");String str = StreamUtils.streamToString(socket.getInputStream());System.out.println(str);socket.close();bufferedOutputStream.close();bufferedInputStream.close();System.out.println("客户端退出");}
}

服务端

package SocketServerandClient;import org.junit.Test;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/24 0:01* 服务端*/
public class ServerHomeWork04 {@Testpublic void getServerHomeWork04() throws Exception {String target = "src\\wb.png";ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端正在监听9999端口………………");// 等待连接Socket socket = serverSocket.accept();// 取到 传输通道中的文件BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(target));byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);bufferedOutputStream.write(bytes); // 这里拷贝文件无需循环System.out.println("服务端图片保存完毕!");// 发送收到图片BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write("收到图片");bufferedWriter.flush(); // 把内容刷新到内容通道socket.shutdownOutput();bufferedWriter.close();bufferedOutputStream.close();bufferedInputStream.close();serverSocket.close();System.out.println("服务端退出");}
}

netstat指令

1.netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况

2.netstat -an | more 可以分页显示,分页后空格显示下一页,回车显示下一行

3.netstat -anb 可以查看具体是哪个程序在占用端口

4.要求在dos控制台下执行
说明:
(1)Listening表示某个端口在监听
(2)如果有一个外部程序(客服端)连接到该端口,就会显示一条ESTABLISHED连接信息
(3)可以输入CTRL + C退出指令

TCP网络不为人知的秘密

  1. 当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的这个端口是TCP/IP来分配的,是不确定的,是随机的。

UDP网络通信编程(了解)

基本介绍

示意图

基本流程

课后练习

练习1


UDP接收端

package udp;import org.junit.Test;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;/*** @author wty* @date 2022/10/24 12:50* <p>* udp编程 接收端*/
public class ReceivePort {@Testpublic void getReceivePort() throws IOException {// 1.创建一个DatagramSocket对象,准备在9999接收数据DatagramSocket datagramSocket = new DatagramSocket(9999);// 2.构建一个DatagramPacket对象准备接收数据,UDP协议一个数据报最大是64Kbyte[] bytes = new byte[64 * 1024];DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);// 3.调用接收方法:将数据通道的DatagramPacket对象,填充到datagramPacket中// 有数据发送过来,就会接收// 没有数据发送过来,就会阻塞System.out.println("接收方9999端口等待发送方发送的数据…………");datagramSocket.receive(datagramPacket);// 4.拆包  取出数据:int length = datagramPacket.getLength();// 实际接收到的数据长度byte[] data = datagramPacket.getData();// 把数据输出System.out.println("接收端收到了来自发送端发送的:");System.out.println(new String(data, 0, length));// 5. 接收到数据后,发送数据String str = "hi my name is world";datagramPacket = new DatagramPacket(str.getBytes(), 0 , str.length() , InetAddress.getByName("192.168.12.1"),9998); // 老韩的IP//datagramPacket = new DatagramPacket(str.getBytes(), 0 , str.length() , InetAddress.getLocalHost(),9998);datagramSocket.send(datagramPacket);// 6.关闭socketdatagramSocket.close();}
}

UDP发送端

package udp;import org.junit.Test;import java.io.IOException;
import java.net.*;/*** @author wty* @date 2022/10/24 12:49* <p>* udp编程 发送端*/
public class SendPort {@Testpublic void getSendPort() throws IOException {// 1.创建datagramSocket准备在9998端口接收数据DatagramSocket datagramSocket = new DatagramSocket(9998);// 2.装包:String str = "hello world";DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(), 0, str.length(), InetAddress.getByName("192.168.12.1"),9998); // 老韩的IP//DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(), 0, str.length(), InetAddress.getLocalHost(), 9999);// 这里先用自己的主机替代// 3.发送datagramSocket.send(datagramPacket);// 4.接收来自接收端收到的接收信息byte[] bytes = new byte[64 * 1024];datagramPacket = new DatagramPacket(bytes,0,bytes.length);datagramSocket.receive(datagramPacket);// 5.拆包byte[] data = datagramPacket.getData();int length = datagramPacket.getLength();System.out.println("发送端接收到接收端的回复:");System.out.println(new String(data, 0, length));// 6.关闭连接datagramSocket.close();}
}

课后作业

作业1普通版

客户端

package HomeWork01;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;/*** @author wty* @date 2022/10/24 17:05*/
public class ClientFun {@Testpublic void getClientFun() throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(),9999);BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));System.out.println("请输入你想了解的事情:");Scanner scanner = new Scanner(System.in);String next = scanner.next();bufferedWriter.write(next);bufferedWriter.flush();socket.shutdownOutput();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String s = bufferedReader.readLine();System.out.println("客户端接收到服务端返回的:");System.out.println(s);// 关闭相应的流bufferedReader.close();bufferedWriter.close();socket.close();}
}

服务端

package HomeWork01;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/24 17:05*/
public class ServerFun {@Testpublic void getServerFun() throws IOException {String serverName = InetAddress.getLocalHost().getHostName();ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端等待9999端口监听…………");Socket socket = serverSocket.accept();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String s = bufferedReader.readLine();System.out.println("服务端接收到客户端发送的:");System.out.println(s);switch (s){case "name":s = "我是" + serverName;break;case"hobby":s = "编写Java程序";break;default:s = "你说啥呢,老弟儿?";}// 接收到语句后返回相应语句BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write(s);bufferedWriter.flush();socket.shutdownOutput();// 关闭相应的流bufferedWriter.close();bufferedReader.close();serverSocket.close();socket.close();}
}

作业1升级版

在作业1普通版的基础上,实现循环问问题的功能

客户端

package HomeWork01;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;/*** @author wty* @date 2022/10/24 17:05*/
public class ClientFun {@Testpublic void getClientFun() throws IOException {String next = "";while (!"q".equals(next)){Socket socket = new Socket(InetAddress.getLocalHost(), 9999);BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));System.out.println("请输入你想了解的事情,输入q退出:");Scanner scanner = new Scanner(System.in);next = scanner.next();bufferedWriter.write(next);bufferedWriter.flush();socket.shutdownOutput();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String s = bufferedReader.readLine();System.out.println("客户端接收到服务端返回的:");System.out.println(s);// 关闭相应的流bufferedReader.close();bufferedWriter.close();socket.close();}System.out.println("你已退出了会话");}
}

服务端

package HomeWork01;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/24 17:05*/
public class ServerFun {@Testpublic void getServerFun() throws IOException {String s = "";while (!"q".equals(s)){String serverName = InetAddress.getLocalHost().getHostName();ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端等待9999端口监听…………");Socket socket = serverSocket.accept();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));s = bufferedReader.readLine();System.out.println("服务端接收到客户端发送的:");System.out.println(s);String return_Str = "";switch (s){case "name":return_Str = "我是" + serverName;break;case"hobby":return_Str = "编写Java程序";break;default:return_Str = "你说啥呢,老弟儿?";}// 接收到语句后返回相应语句BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write(return_Str);bufferedWriter.flush();socket.shutdownOutput();// 关闭相应的流bufferedWriter.close();bufferedReader.close();serverSocket.close();socket.close();}System.out.println("退出了服务端");}
}

作业2


发送端

package HomeWork02;import org.junit.Test;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;/*** @author wty* @date 2022/10/24 18:06*/
public class SendWork {@Testpublic void getSendWork() throws IOException {DatagramSocket datagramSocket = new DatagramSocket(9999);System.out.println("请输入你想提出的问题:");Scanner scanner = new Scanner(System.in);String next = scanner.next();DatagramPacket datagramPacket = new DatagramPacket(next.getBytes(), 0, next.getBytes().length, InetAddress.getLocalHost(), 9998);datagramSocket.send(datagramPacket);// 发送端接收到接收端回应的数据并展示byte[] bytes = new byte[64 * 1024];datagramPacket = new DatagramPacket(bytes, bytes.length);datagramSocket.receive(datagramPacket);int length = datagramPacket.getLength();byte[] data = datagramPacket.getData();String s = new String(data, 0, length);System.out.println("发送端接收到的数据是:");System.out.println(s);datagramSocket.close();System.out.println("发送端退出");}
}

接收端

package HomeWork02;import org.junit.Test;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @author wty* @date 2022/10/24 18:06*/
public class ReceiveWork {@Testpublic void getReceiveWork() throws IOException {DatagramSocket datagramSocket = new DatagramSocket(9998);byte[] bytes = new byte[64 * 1024];DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);System.out.println("接收端正在监听9998端口…………");datagramSocket.receive(datagramPacket);int length = datagramPacket.getLength();byte[] data = datagramPacket.getData();String s = new String(data, 0, length);System.out.println("接收到的来此发送端的数据是:");System.out.println(s);String return_str = "";switch (s) {case "四大名著是哪些":return_str = "红楼梦、西游记、水浒传、三国演义";break;default:return_str = "what?";}// 接收端接收到数据后,继续发送回应datagramPacket = new DatagramPacket(return_str.getBytes(), 0, return_str.getBytes().length, InetAddress.getLocalHost(), 9999);datagramSocket.send(datagramPacket);datagramSocket.close();System.out.println("接收端退出");}
}

作业3


客户端

package MusicDownLoad;import org.junit.Test;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;/*** @author wty* @date 2022/10/24 22:45* 客户端*/
public class ClientPortMusic {@Testpublic void getClientPortMusic() throws Exception {System.out.println("请输入一个文件名称");Scanner scanner = new Scanner(System.in);String musicName = scanner.next();Socket socket = new Socket(InetAddress.getLocalHost(), 9999);BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write(musicName);bufferedWriter.flush();socket.shutdownOutput();// 获取服务端发送过来的文件String path = "E:\\" + musicName + ".mp3";BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path));BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);bufferedInputStream.read(bytes);bufferedOutputStream.write(bytes, 0, bytes.length);bufferedOutputStream.flush();System.out.println("文件:" + path + "下载完成!");socket.close();bufferedInputStream.close();bufferedOutputStream.close();bufferedWriter.close();System.out.println("客户端退出");}
}

服务端

package MusicDownLoad;import org.junit.Test;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author wty* @date 2022/10/24 22:45* 服务端*/
public class ServerPortMusic {@Testpublic void getServerPortMusic() throws Exception {// 1.监听客户端ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端监听9999端口等待文件传递………………");// 2.等待客户端连接Socket socket = serverSocket.accept();String musicName = StreamUtils.streamToString(socket.getInputStream());System.out.println("musicName:" + musicName);musicName = musicName.replace("\r\n", "");String path = "";//String fileName = "";switch (musicName) {case "同学你好":path = "src\\同学你好.mp3";//fileName = "同学你好.mp3";break;case "无声拥抱":path = "src\\无声拥抱.mp3";//fileName = "无声拥抱.mp3";break;case "香格里拉":path = "src\\香格里拉.mp3";//fileName = "香格里拉.mp3";break;default:path = "src\\default.mp3";//fileName = "default.mp3";}BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path));BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);bufferedInputStream.read(bytes);System.out.println("读取文件:  " + path + " 完毕!");bufferedOutputStream.write(bytes, 0, bytes.length);bufferedOutputStream.flush();socket.shutdownOutput();// 关闭流serverSocket.close();socket.close();bufferedOutputStream.close();bufferedInputStream.close();System.out.println("服务端退出");}
}

Java网络编程 韩顺平 自学笔记相关推荐

  1. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接 ...

  2. MySQL数据库基础01 韩顺平 自学笔记

    MySQL数据库基础 数据库简单原理图 连接Mysql 启动和关闭mysql服务 连接Mysql指令 数据库三层结构 数据在数据库中的存储方式 SQL语句的分类 简单通过Java操作Mysql数据库 ...

  3. MySQL数据库基础02 韩顺平 自学笔记

    MySQL数据库基础02 sql表查询增强 分页查询 分组函数和分组子句 数据分组的总结 多表查询 问题的引出 多表查询的练习 自连接 子查询 子查询当作临时表使用 在多行子查询中使用all操作符 在 ...

  4. 非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.6 抽象类

    非零基础自学Java (老师:韩顺平) ✈[[零基础 快速学Java]韩顺平 零基础30天学会Java] 第10章 面向对象编程(高级部分) 文章目录 非零基础自学Java (老师:韩顺平) 第10章 ...

  5. Java网络编程笔记5

    在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...

  6. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  7. 菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)

    菜鸟学习笔记:Java提升篇9(网络1--网络基础.Java网络编程) 网络基础 什么是计算机网络 OS七层模型 Java网络编程 InetAddress InetSocketAddress URL类 ...

  8. JAVA网络编程个人笔记 第4章 inet地址

    JAVA网络编程个人笔记 第4章 inet地址 Internet寻址 创建InetAddress对象 常用方法 getLocalHost() 代码实现 getByName() 代码实现 getAllB ...

  9. java网络编程 个人笔记 第二章 流

    java网络编程 个人笔记 第二章 流 流 I/O介绍 java流式输入/输出原理 输入输出流分类 节点流和处理流 节点流的类型 处理流的类型 InputStream(输入流) InputStream ...

最新文章

  1. ECSHOP让产品浏览历史按照先后进行排序
  2. oracle 辅助实例,初学rman问题小记三:创建辅助实例遇到的ORA-01031
  3. rails.vim环境安装(ubuntu)
  4. pat 甲级1013
  5. 自写sonar 插件加载到sonar 服务中的展示信息
  6. 12亿行代码,阿里巴巴这一年的技术报告和梦想报告
  7. LeetCode 523. Continuous Subarray Sum
  8. Kafka源码解析 - 副本迁移任务提交流程
  9. Zlib解压/压缩实现
  10. lisp 读取dwg 统计信息_用阿里云交易和账单管理API实现MaxCompute费用对账分摊统计...
  11. 宽字节与多字节之间的转换
  12. 使用GitHub管理代码
  13. [翻译]A MAP BASED ON LASERSCANS WITHOUT GEOMETRIC INTERPRETATION
  14. MySQL 读写分离原理
  15. iOS开发之—— XCODE真机调试设备连接一直忙碌如何处理!(真机调试各种错误提示解决)...
  16. IE可以打开网页 但是chrome和火狐打不开网页解决办法
  17. int函数使用方法c语言,int函数(int函数的使用方法举例)
  18. 阿里资深架构师的学习之路
  19. 计算机考试综合模块怎么做,《综合素质》几大模块备考指导要知道!
  20. 【Android学习之路】之从零开始做一个小项目(一)

热门文章

  1. java基础知识练习作业(0606)
  2. android.hardware.camera2详解
  3. 微搭使用笔记(五) 通过数据源API写入数据并展示到页面
  4. 简单冲裁模、连续冲裁模、复合冲裁模,你搞懂了吗?
  5. 5G概念炒的火热,公共WiFi建设却为何不见进展?
  6. Codeforces Round #389 Div.2 C. Santa Claus and Robot
  7. 爬虫技术——抓取滴滴打车优惠券
  8. 京东账户集中被盗 拷问电商网站安全
  9. 滁州市商标注册自行办理与代理机构办理区别,申请所需文件有哪些?
  10. 用python画小黄人步骤图-学Python画画:应用Turtle库画一个蠢萌的小黄人