IP地址(Internet Protocol):唯一标识网络上的每一台计算机
IP地址的组成:32位,由4个8位二进制数组成
二进制不便记忆,所以转换为十进制(最多不能超过255)
IP地址 = 网络地址 + 主机地址
1>网络地址:标识计算机或网络设备所在网段
2>主机地址:标识特定主机或网络设备
二.IP地址的配置和检测
1.查看IP地址,检测网络是否畅通
1>查看本机的IP地址:ipconfig
2>测试网络是否畅通:ping 目标IP地址
三.DNS域名解析
1.网络服务器:通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机。
四.网络通信协议
1.网络通信协议:为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合
五.Socket简介
1.什么是Socket:
1>通信链路的端点就被称为“套接字”(英文Socket)
2>是提供给应用程序的接口
Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制。
2.Socket分类:
1>流式套接字(Socket_STREAM):面向连接、可靠的数据传输服务
2>数据报式套接字(SOCK_DGRAM):无连接服务
3>原始式套接字(SOCK_RAW)
六.java.net包
1.java.net包
Socket
ServerSocket
DatagramPacket
DatagramSocket
InetAddress
…
七.基于TCP协议的Socket编程
1.基于TCP协议的Socket网络通信:用来实现双向安全连接网络通信
2.Socket通信模型:进行网络通信时,Socket需要借助数据流来完成数据的传递工作。
面向TCP连接的编程
传输对象
//用户类
public class User implements Serializable{
private String userName;
private String pwd;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String userName, String pwd) {
super();
this.userName = userName;
this.pwd = pwd;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
//服务器端
public class LoginServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(5000);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
User user = (User)ois.readObject();
System.out.println("客户端说:"+user.getUserName()+"-"+user.getPwd());
//给客户端一个响应
String reply = "欢迎登录!";
OutputStream os = socket.getOutputStream();
os.write(reply.getBytes());
os.close();
ois.close();
is.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//客户端
public class LoginClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",5000);
User user = new User("Tom","123456");
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(user);
socket.shutdownOutput();
//接受服务器端给我的响应
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply;
while((reply = br.readLine()) != null){
System.out.println("服务器端说:"+reply);
}
br.close();
is.close();
oos.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
八.多线程处理多请求:
思路:
服务器:一直监听客户请求,一旦监听到有客户请求,立刻创建一个线程,开启线程。
线程:接受客户请求,给与客户一个响应,线程构造方法中去绑定客户端的Socket
客户端:
发送请求到服务器,接收服务器的响应
如何获得客户端的IP?
InetAddress
//用户类
public class User implements Serializable{
private String userName;
private String pwd;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String userName, String pwd) {
super();
this.userName = userName;
this.pwd = pwd;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
//服务器端
public class LoginServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(5000);
while(true){
Socket socket = serverSocket.accept();
LoginThread lt = new LoginThread(socket);
lt.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//线程
public class LoginThread extends Thread{
private Socket socket;
public LoginThread(Socket socket) {
super();
this.socket = socket;
}
public void run() {
try {
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
User user = (User)ois.readObject();
System.out.println("客户端说:"+user.getUserName()+"-"+user.getPwd());
InetAddress ia = socket.getInetAddress();
String ip = ia.getHostAddress();
System.out.println("相应客户端的IP:"+ip);
String reply = "欢迎登录!";
OutputStream os = socket.getOutputStream();
os.write(reply.getBytes());
os.close();
ois.close();
is.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//客户端
public class LoginClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",5000);
User user = new User("Tom","123456");
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(user);
socket.shutdownOutput();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply;
while((reply = br.readLine()) != null){
System.out.println("服务器端说:"+reply);
}
br.close();
is.close();
oos.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
九.基于UDP协议的Socket编程
TCP与UDP的区别:
基于UDP协议的Socket网络编程步骤:
1>利用DatagramPacket 对象封装数据包
2>利用DatagramSocket 发送数据包
3>利用DatagramSocket 接收数据包
4>利用DatagramSocket处理数据包
基于UDP的Socket通信:
//服务器端
public class LoginServer {
public static void main(String[] args) {
//准备了一个空包
byte[] infos = new byte[1024];
DatagramPacket dp = new DatagramPacket(infos,infos.length);
DatagramSocket socket = null;
//快递点
try {
socket = new DatagramSocket(5000);
//在快递点取礼物
socket.receive(dp);
//拆礼物
String info = new String(dp.getData(),0,dp.getData().length);
System.out.println("客户端说的话:"+info);
//给客户端一个响应
String reply = "一件羽绒服";
byte[] replys = reply.getBytes();
//客户端地址
SocketAddress sa = dp.getSocketAddress();
DatagramPacket dp1 = new DatagramPacket(replys,0,replys.length,sa);
//寄出去
socket.send(dp1);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
socket.close();
}
}
}
//客户端
public class LoginClient {
public static void main(String[] args) {
//买礼物
String info = "心型巧克力";
byte[] infos = info.getBytes();
InetAddress ia;
DatagramSocket socket = null;
try {
ia = InetAddress.getByName("localhost");
DatagramPacket dp = new DatagramPacket(infos,infos.length,ia,5000);
socket = new DatagramSocket();
socket.send(dp);
//接受服务器的一个响应
byte[] replys = new byte[1024];
DatagramPacket dp1 = new DatagramPacket(replys,replys.length);
socket.receive(dp1);
String reply = new String(dp1.getData(),0,dp1.getData().length);
System.out.println("服务器端的响应:"+reply);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
socket.close();
}
}
}
来源:https://blog.csdn.net/weixin_43857032/article/details/86064650