1、网络编程的基础知识
计算机网络的功能、计算机网络的分类、osi分层模型和tcp/ip分层模型等这些基础知识在这里就不过多阐述,可以自己网上查资料了解。因为讲太细内容就很多,写不过来。讲个大概,还不如自己网上查资料看。
1.2、IP地址和端口号
这个也是自己网上查资料学习,我们的侧重点不在这里
2、使用InetAddress
Java类提供了InetAddress类来代表IP地址,InetAddress下还有两个子类:Inet4Address、Inet6Address,它们分别代表IPv4地址和IPv6地址
下面根据代码来简单学习一下InetAddress的使用
public static void main(String[] args) throws IOException {
//获取InetAddress实例
InetAddress inetAddress=InetAddress.getLocalHost();
//判断地址是否可达
boolean reach=inetAddress.isReachable(2000);
System.out.println(reach);
//获取主机名
String hostName=inetAddress.getHostName();
System.out.println(hostName);
//获取ip
String ip=inetAddress.getHostAddress();
System.out.println(ip);
}
3、使用URLEncoder和URLDecoder
URLEncoder和URLDecoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串(百度地址栏的乱码字符串)之间的相互转换。
下面根据代码来简单学习一下这两个类的使用
public static void main(String[] args) throws UnsupportedEncodingException {
//将普通字符串转换成application/x-www-form-urlencoded字符串
String value= URLEncoder.encode("胡图图","UTF-8");
System.out.println(value);
//将application/x-www-form-urlencoded字符串转换成普通字符串
String value1= URLDecoder.decode(value,"UTF-8");
System.out.println(value1);
}
4、基于TCP协议的网络编程
TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。Java对基于TCP协议的网络通信提供了良好的封装,Java使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行通信。
IP协议保证了计算机之间可以发送和接收数据,但不能解决数据分组在传输过程中可能出现的问题;TCP协议为计算机通信建立连接,提供可靠并且无差错的通信服务
TCP协议使用重发机制——当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体的确认信息,如果没有收到另一个通信实体的确认信息,则会再次重发刚才发送的信息
5、ServerSocket和Socket
ServerSocket用于监听来自客户端的Socket连接(创建服务器)
Socket用于连接到指定服务器(创建客户端)
下面根据代码来简单学习一下这两个类的使用
public class Server {
public static void main(String[] args) throws IOException {
//服务器(不指定ip默认本机ip),端口通常使用1024以上的,避免与其他应用程序的通用端口冲突
ServerSocket serverSocket=new ServerSocket(10086);
//一直接收客户端请求
while (true){
//等待连接
Socket socket=serverSocket.accept();
//获取对应输出流包装成打印流
PrintStream printStream=new PrintStream(socket.getOutputStream());
//打印数据
printStream.println("你好,客户端");
//关闭流
printStream.close();
serverSocket.close();
}
}
}
public class Client {
public static void main(String[] args) throws IOException {
//客户端
Socket socket=new Socket("192.168.59.72",10086);
//获取对应输入流并包装成BufferedReader
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取数据
String content=bufferedReader.readLine();
System.out.println("来自服务器:"+content);
//关闭资源
bufferedReader.close();
socket.close();
}
}
/**
*上面程序为了突出通过ServerSocket和Socket建立连接,并通过底层IO流进行*通信的主题,没有进行异常处理,也没有使用finally块来关闭资源
*/
6、C/S聊天室应用
实现一个命令行界面的C/S聊天室应用,服务器端应包含多个线程,每个Socket对应一个线程,该线程负责读取Socket对应输入流的数据(从客户端发送过来的数据),并将读到的数据向每个Socket输出流发一次(将一个客户端发送的数据“广播”给其他客户端)
/**
* 服务器端
*/
public class Server {
//客户端容器
public static List<Socket> socketList=new ArrayList<>();
public static void main(String[] args) throws IOException {
//服务器
ServerSocket serverSocket=new ServerSocket(10087);
while (true){
//等待客户端连接
Socket socket=serverSocket.accept();
//将获取的客户端放入socketList
socketList.add(socket);
//处理请求
new Thread(new ServerThread(socket)).start();
}
}
}
/**
* 处理客户端请求
*/
public class ServerThread implements Runnable{
private Socket socket;//客户端
private BufferedReader bufferedReader;//输入流
private PrintStream printStream;//打印流
public ServerThread(Socket socket) {
this.socket = socket;
}
/**
* 线程主体
*/