1.什么是网络编程
网络通信三要素
2.InetAddress类:
package day1_ip;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpTest {
public static void main(String[] args) throws IOException {
//获取本机IP地址对象
InetAddress ip1 = InetAddress.getLocalHost();
System.out.println(ip1.getHostName());
System.out.println(ip1.getHostAddress());
//获取指定IP或者域名的IP地址对象
InetAddress ip2 = InetAddress.getByName("www.baidu.com");
System.out.println(ip2.getHostName());
System.out.println(ip2.getHostAddress());
//ping www.baidu.com
System.out.println(ip2.isReachable(6000));
}
}
3.端口号:
协议:
1.DatagramSocket:创建客户端,服务端
1.1udp快速入门: 单发单收
client.java:
package day1_ip;
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] bytes = "我是wwx客户端".getBytes(StandardCharsets.UTF_8);
/*
DatagramPacket(byte buf[], int offset, int length,
InetAddress address, int port)
参数1:封装要发出去的数据
参数2:发送出去的数据大小(字节个数)
参数3:服务器的IP地址(找到服务端主机)
参数4:服务端程序的端口
*/
DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
InetAddress.getLocalHost(), 7777);
socket.send(packet);
System.out.println("客户端发送完毕");
socket.close();
}
}
server.java
package day1_ip;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动");
DatagramSocket socket = new DatagramSocket(7777);
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
int packetLength = packet.getLength();
String recievestring = new String(buffer, 0, packetLength);
System.out.println(recievestring);
socket.close();
}
}
2.多发多收:
先设置:设置完成后,才能启动多个客户端
Client.java:
package day1_ip;
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
//创建客户端对象,别指定端口,让系统自动分配端口,才不会导致端口冲突
DatagramSocket socket = new DatagramSocket();
/*
DatagramPacket(byte buf[], int offset, int length,
InetAddress address, int port)
参数1:封装要发出去的数据
参数2:发送出去的数据大小(字节个数)
参数3:服务器的IP地址(找到服务端主机)
参数4:服务端程序的端口
*/
//创建数据包对象封装要发出去的数据
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("欢迎来到聊天室");
String s = sc.nextLine();
// byte[] bytes = s.getBytes(s);
if("exit".equals(s)){
System.out.println("退出成功");
socket.close();
break;
}
byte[] bytes = s.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
InetAddress.getLocalHost(), 6666);
socket.send(packet);
System.out.println("客户端发送完毕");
}
}
}
Server.java:
package day1_ip;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("服务端启动");
//创建一个服务端对象
DatagramSocket socket = new DatagramSocket(6666);
//创建一个数据包对象,用于接收数据
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
//开始正式使用数据包接收客户端发来的数据
socket.receive(packet);
//从字节数组中,把接收到的数据打印出来
int packetLength = packet.getLength();
String recievestring = new String(buffer, 0, packetLength);
System.out.println(recievestring);
System.out.println("**********************************");
// socket.close(); //服务端不要关闭资源
}
}
}
Tcp :
tcp快速入门:单收单发
Client.java
package day_tcp;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8888);
//从socket通信管道中得到一个字节输出流,发给服务端程序
OutputStream os = socket.getOutputStream();
//把低级字节输出流包装成数据输出流
DataOutputStream dataOutputStream = new DataOutputStream(os);
dataOutputStream.writeUTF("哈哈哈哈");
dataOutputStream.close();
socket.close();
}
}
server.java
package day_tcp;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("*****服务端启动*****");
//1,创建ServerSocket的对象,同时为服务注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//2,使用serverSocket对象,调用一个accept方法,等待客户端的链接请求
Socket socket = serverSocket.accept();
//3,从socket通信管道中得到一个字节输入流
InputStream inputStream = socket.getInputStream();
//4,把原始字节输入流包装成数据输入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
//5,用数据输入流读取客户端发送的消息
String s = dataInputStream.readUTF();
System.out.println(s);
//获取客户端ip地址
System.out.println(socket.getRemoteSocketAddress());
socket.close();
}
}
运行效果:
tcp通信:多发多收(单服务端,单客户端)
Client.java
package day_tcp;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("欢迎来到聊天室内");
Socket socket = new Socket("127.0.0.1", 8888);
//从socket通信管道中得到一个字节输出流,发给服务端程序
OutputStream os = socket.getOutputStream();
//把低级字节输出流包装成数据输出流
DataOutputStream dataOutputStream = new DataOutputStream(os);
Scanner sc = new Scanner(System.in);
while (true) {
String s = sc.nextLine();
if ("exit".equals(s)){
System.out.println("恭喜您退出成功!欢迎下次光临");
dataOutputStream.close();
socket.close();
break;
}
dataOutputStream.writeUTF(s);
dataOutputStream.flush();
}
//dataOutputStream.close();
// socket.close();
}
}
server.java
package day_tcp;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("*****服务端启动*****");
//1,创建ServerSocket的对象,同时为服务注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//2,使用serverSocket对象,调用一个accept方法,等待客户端的链接请求
Socket socket = serverSocket.accept();
//3,从socket通信管道中得到一个字节输入流
InputStream inputStream = socket.getInputStream();
//4,把原始字节输入流包装成数据输入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
//5,用数据输入流读取客户端发送的消息
while (true) {
try {
String s = dataInputStream.readUTF();
System.out.println(s);
} catch (Exception e) {
System.out.println(socket.getRemoteSocketAddress()+"下线了");
socket.close();
dataInputStream.close();
break;
}
}
//获取客户端ip地址
// System.out.println(socket.getRemoteSocketAddress());
//socket.close();
}
}
运行效果:
tcp通信:多发多收(多客户端)
Client1.java
package day_tcp2;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client1 {
public static void main(String[] args) throws IOException {
System.out.println("欢迎来到聊天室内");
Socket socket = new Socket("127.0.0.1", 8888);
//从socket通信管道中得到一个字节输出流,发给服务端程序
OutputStream os = socket.getOutputStream();
//把低级字节输出流包装成数据输出流
DataOutputStream dataOutputStream = new DataOutputStream(os);
Scanner sc = new Scanner(System.in);
while (true) {
String s = sc.nextLine();
if ("exit".equals(s)){
System.out.println("恭喜您退出成功!欢迎下次光临");
dataOutputStream.close();
socket.close();
break;
}
dataOutputStream.writeUTF(s);
dataOutputStream.flush();
}
//dataOutputStream.close();
// socket.close();
}
}
Server.java
package day_tcp2;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("*****服务端启动*****");
//1,创建ServerSocket的对象,同时为服务注册端口
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
//2,使用serverSocket对象,调用一个accept方法,等待客户端的链接请求
Socket socket = serverSocket.accept();
//把这个客户端对于的socket通信管道,交给一个独立的进程负责处理
new ServerReadThread(socket).start();
System.out.println(socket.getRemoteSocketAddress() + "上线了");
}
}
}
ServerReadThread.java
package day_tcp2;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ServerReadThread extends Thread {
private Socket socket;
public ServerReadThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while (true) {
try {
String msg = dis.readUTF();
System.out.println(msg);
} catch (Exception e) {
System.out.println(socket.getRemoteSocketAddress() + "下线了");
dis.close();
socket.close();
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}