Java网络编程 韩顺平 自学笔记
这里写目录标题
- 网络编程
- 网络通信
- 网络
- 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
网络编程
网络通信
- 概念:两台设备之间通过网络实现数据传递
- 网络通信:将数据通过网络从一台设备传输到另一台设备
- java.net包下提供了一系列的类或者接口,供程序员完成网络通讯。
网络
- 概念:两台或者多台设备通过一定物理设备连接起来构成了网络
- 根据网络的覆盖范围不同,对网络进行分类:
局域网:覆盖范围最小,仅仅覆盖了一个教室或者一个机房
城域网:覆盖范围较大,可以覆盖一个城市
广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表
ip地址
- 概念:用于唯一标识网络中的每台计算机/主机
- 查看ip地址:ipconfig
- ip地址的表示形式:点分十进制 XX.XX.XX.XX
- 每一个十进制数的范围:0~255
- ip地址的组成:网络地址+主机地址,比如192.169.12.69
- IPv6是互联网工程任务组设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为地球上的每一粒沙子编上一个地址
- 由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展IPv6的使用,不仅能解决网络地址资源数量的问题,而且还解决了多种设备接入互联网的障碍。
- IPv4 :4个字节 IPv6:16个字节
ipv4地址分类
域名
- www.baidu.com
- 好处:方便记忆,解决记ip的困难
- 概念:将ip地址映射成域名
端口号
- 概念:用于表示计算机上某个特定的网络程序
- 表示形式:以整数形式,范围0~65535 (2个字节)
- 0~1024已经被占用,比如ssh 22,ftp 21,smtp 25,http 80
- 常间的网络程序端口
tomcat:8080
mysql:3306
oracle:1521
sqlserver:1433
网络通信协议
协议(tcp/ip)
TCP/IP中文译名为传输控制协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成。
TCP和UDP
TCP协议:传输控制协议
- 使用TCP协议前,预先建立TCP连接,形成传输数据通道
- 传输前,采用"三次握手"方式,是可靠的
- TCP协议进行通信的两个应用进程:客户端、服务端
- 在连接中可进行最大数据量的传输
- 传输完毕,需要释放自己建立的连接,效率低
UDP协议
- 将数据、源、目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K以内
- 因无需连接,故是不可靠的
- 发送数据结束时无需释放资源(因为不是面向连接的),速度快
- 举例:厕所通知:发短信
InetAddress类
相关方法
- 获取本机InetAddress对象,getLocalHost
- 根据指定主机名、域名获取ip地址对象,getByName
- 获取InetAddress对象的主机名 getHostName
- 获取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
基本介绍
- 套接字(Socket)开发网络应用程序被广泛采用,以至于称为事实上的标准。
- 通信的两端都要有Socket,是两台机器间通信的端点
- 网络通信其实就是Socket间的通信
- Socket允许程序把网络连成一个流,数据在两个Socket间通过IO传输。
- 一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。
TCP网络通信编程
基本介绍
- 基于客户端——服务端的网络通信
- 底层使用的是TCP/IP协议
- 应用场景举例:客户端发送数据,服务端接收并显示
- 基于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网络不为人知的秘密
- 当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的这个端口是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网络编程 韩顺平 自学笔记相关推荐
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a 连接 ...
- MySQL数据库基础01 韩顺平 自学笔记
MySQL数据库基础 数据库简单原理图 连接Mysql 启动和关闭mysql服务 连接Mysql指令 数据库三层结构 数据在数据库中的存储方式 SQL语句的分类 简单通过Java操作Mysql数据库 ...
- MySQL数据库基础02 韩顺平 自学笔记
MySQL数据库基础02 sql表查询增强 分页查询 分组函数和分组子句 数据分组的总结 多表查询 问题的引出 多表查询的练习 自连接 子查询 子查询当作临时表使用 在多行子查询中使用all操作符 在 ...
- 非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.6 抽象类
非零基础自学Java (老师:韩顺平) ✈[[零基础 快速学Java]韩顺平 零基础30天学会Java] 第10章 面向对象编程(高级部分) 文章目录 非零基础自学Java (老师:韩顺平) 第10章 ...
- Java网络编程笔记5
在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
- 菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)
菜鸟学习笔记:Java提升篇9(网络1--网络基础.Java网络编程) 网络基础 什么是计算机网络 OS七层模型 Java网络编程 InetAddress InetSocketAddress URL类 ...
- JAVA网络编程个人笔记 第4章 inet地址
JAVA网络编程个人笔记 第4章 inet地址 Internet寻址 创建InetAddress对象 常用方法 getLocalHost() 代码实现 getByName() 代码实现 getAllB ...
- java网络编程 个人笔记 第二章 流
java网络编程 个人笔记 第二章 流 流 I/O介绍 java流式输入/输出原理 输入输出流分类 节点流和处理流 节点流的类型 处理流的类型 InputStream(输入流) InputStream ...
最新文章
- ECSHOP让产品浏览历史按照先后进行排序
- oracle 辅助实例,初学rman问题小记三:创建辅助实例遇到的ORA-01031
- rails.vim环境安装(ubuntu)
- pat 甲级1013
- 自写sonar 插件加载到sonar 服务中的展示信息
- 12亿行代码,阿里巴巴这一年的技术报告和梦想报告
- LeetCode 523. Continuous Subarray Sum
- Kafka源码解析 - 副本迁移任务提交流程
- Zlib解压/压缩实现
- lisp 读取dwg 统计信息_用阿里云交易和账单管理API实现MaxCompute费用对账分摊统计...
- 宽字节与多字节之间的转换
- 使用GitHub管理代码
- [翻译]A MAP BASED ON LASERSCANS WITHOUT GEOMETRIC INTERPRETATION
- MySQL 读写分离原理
- iOS开发之—— XCODE真机调试设备连接一直忙碌如何处理!(真机调试各种错误提示解决)...
- IE可以打开网页 但是chrome和火狐打不开网页解决办法
- int函数使用方法c语言,int函数(int函数的使用方法举例)
- 阿里资深架构师的学习之路
- 计算机考试综合模块怎么做,《综合素质》几大模块备考指导要知道!
- 【Android学习之路】之从零开始做一个小项目(一)
热门文章
- java基础知识练习作业(0606)
- android.hardware.camera2详解
- 微搭使用笔记(五) 通过数据源API写入数据并展示到页面
- 简单冲裁模、连续冲裁模、复合冲裁模,你搞懂了吗?
- 5G概念炒的火热,公共WiFi建设却为何不见进展?
- Codeforces Round #389 Div.2 C. Santa Claus and Robot
- 爬虫技术——抓取滴滴打车优惠券
- 京东账户集中被盗 拷问电商网站安全
- 滁州市商标注册自行办理与代理机构办理区别,申请所需文件有哪些?
- 用python画小黄人步骤图-学Python画画:应用Turtle库画一个蠢萌的小黄人