一、认识网络
1.网络就是连接在一起可以共享数据和资源的一组计算机。
2.计算机网络分类:局域网,城域网,广域网。
3.ip地址:在网络上使用一种具有层次结构的逻辑地址来标识一台计算机,这个地址就叫做ip地址。
4.ip地址是用来唯一标识网络中的每一台计算机。
5.网络地址:标识计算机网络设备的网段。主机地址:标识特定主机或者网络设备。
6.查看本机ip地址:使用dos命令,winl+R键,输入cmd,进入dos窗口,输入ipconfig,查看到本机ip地址!
7.测试网络连接是否通畅:使用dos命令,winl+R键,输入cmd,进入dos窗口,输入ping +本机ip地址。
二、网络同行协议
TCP协议:中文名叫做传输控制协议。TCP是一种面向连接的,可靠的,基于字符流的传输通信协议。保证数据的安全性!
UDP协议:中文名叫做用户数据报协议。UDP协议是一个无连接协议,不需要连接,不安全!
实现基于TCP协议的Socket编程:
socket就是套接字。位于java.net包,可以监听用户的连接请求。
java.net包的两个类:Socekt类和ServerSocket类。
socket对象是在客户端和服务器之间建立连接。表示客户端
ServerSocket对象是等待客户端建立连接,连接建立以后可以进行同信。
代码如下:
// 客户端
public class LoginClient {
public static void main(String[] args) throws Exception {
// 1.发送请求到服务器
// 创建一个客户端的Socket
Socket socket = new Socket("localhost",8000);
// 通过输出流发送请求
String info = "用户名:Tom;密码:123456";
OutputStream os = socket.getOutputStream();
os.write(info.getBytes());
// 相当于告诉服务器,我说的话说完了
socket.shutdownOutput();
// 2.通过输入流接收服务器给我的响应
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply = null;
while ((reply = br.readLine())!= null) {
System.out.println("服务器说:" + reply);
}
// 关闭资源
br.close();
is.close();
os.close();
socket.close();
}
}
//服务器端
public class LoginServer {
public static void main(String[] args) throws Exception {
// 接收客户端请求
// 创建一个服务器端的Socket
ServerSocket severSocket = new ServerSocket(8000);
// 使用accept()侦听并接收到此ServerSocket的连接,并用客服端的Socket接收
Socket socket = severSocket.accept();
// 通过Socket获得输入流,获得用户的请求,用字节流输入流接收
InputStream is = socket.getInputStream();
// 将字节流包成字符流,字符流包成缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine())!= null) {
System.out.println("客户端说:" + info);
}
// 给客户端响应
String reply = "欢迎登录!";
// 通过输出流发送给客户端
OutputStream os = socket.getOutputStream();
os.write(reply.getBytes());
socket.shutdownOutput();
Thread.sleep(1000);
// 释放相应资源
os.close();
br.close();
is.close();
socket.close();
severSocket.close();
}
}
//注意:在连接完成之后,一定要记得关闭资源,先开的后关,后开的先关。
当然,还可以传递对象信息,进行序列化和反序列化操作就可以。
实现多客户端用户登录,采用多线程的方式,可以在服务端创建一个专门负责监听的应用服务程序,一个专门负责响应的线程程序。
代码如下:
//服务端
public class Sever {
public static void main(String[] args) throws Exception {
//建立连接,指定端口开始监听
ServerSocket serverSocket=new ServerSocket(8000);
//声明socekt
Socket socket=null;
//使用循环,监听一直存在,只要发起请求,就去响应
while(true) {
socket=serverSocket.accept(); //使用accept()方法等待客户端发起同信
MyThread my=new MyThread(socket);
my.start();
}
}
}
//客户端:这里只是创建了一个客户端,可以多创建几个客户端,方便测试!
public class Client {
public static void main(String[] args) throws Exception{
//建立客户端连接
Socket socket=new Socket("localhost",8000);
//打开输入流,输出流
OutputStream os=socket.getOutputStream();
InputStream is=socket.getInputStream();
//发起客户端登录信息,就是向输出流写入信息
String info="用户名:Jack;密码:456123";
os.write(info.getBytes());
//相当于告诉服务器,我说的话已经说完了
socket.shutdownOutput();
//接收服务端的响应
String reply=null;
BufferedReader br=new BufferedReader(new InputStreamReader(is));
while((reply=br.readLine())!=null) {
System.out.println("我是客户端,服务器响应是:"+reply);
}
//关闭资源
br.close();
is.close();
os.close();
socket.close();
}
}
//创建线程类
public class MyThread extends Thread{
public Socket socket; //对象属性
/**
* 有参构造,传递socket属性过来,没启动一个线程,连接对应的Socket
* @param socket
*/
public MyThread(Socket socket) {
this.socket = socket;
}
public void run() {
InputStream is=null;
OutputStream os=null;
BufferedReader br=null;
try {
//读操作
is=socket.getInputStream();
//获取客户端信息
br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null) {
System.out.println("我是服务器,客户端登录信息为:"+info);
}
//给客户端一个响应,
os=socket.getOutputStream();
String reply="欢迎你,登录成功!";
os.write(reply.getBytes());
socket.shutdownOutput();
Thread.sleep(2000);
} catch (Exception e) {
e.getStackTrace();
} finally {
//关闭资源
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
is.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意:这里的服务器处于一直监听客户端请求,一旦监听到客户请求,就立即去创建一个线程。
线程是接纳客户请求,给予客户一个响应,利用线程的构造方法去绑定客户端的socket。
客户端是发送请求到服务器,接收服务器的响应。
TCU协议和UDP协议的区别
协议 | TCP | UDP |
是否连接 | 面向连接 | 无连接 |
传输可靠性(安全) | 可靠 | 不可靠 |
连接速度 | 慢 | 快 |