一.首先是网络编程的三要素:IP地址,端口号,通信协议
1.IP地址:通过docs命令:ipconfig
可以通过ping ip命令查看当前ip是否通畅:
2. 端口号:正在运行的程序标识。有效端口:0-65535,其中0~1024系统使用或保留端口,所以端口尽量要用1024以上的,可以使用netstat -ano命令查看所有运行程序的端口。太长了这里截取一部分
3.通信协议:
常见的有两种协议:
TCP和UDP协议
UDP:
将数据源和目的地封装到数据包中,不需要建立连接。
每个数据包的大小限制在64K。
因为不建立连接,所以安全性差,速度快。
TCP:
建立连接形成传输数据的通道,然后再传输数据,通过三次握手。
安全性高,效率低。
二.具体实现步骤
1.UDP协议方式:
UDPSend.java
package ch.hp.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* socket 网络编程之UDP协议 发送方
*/
public class UDPSend {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();//创建DatagramSocket对象
String data = "UDP......";//要发送的数据
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(data.getBytes(),0,data.length(),inetAddress,9999);
socket.send(packet);//发送
socket.close();//关闭
}
}
UDPReceive.java
package ch.hp.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* socket 网络编程之UDP协议 接收方
*/
public class UDPReceive {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
//创建数据包对象 ,用于接收发送方发送的字节数组的数据
DatagramPacket packet = new DatagramPacket(new byte[4096],4096);
socket.receive(packet);//接收数据
byte[] data = packet.getData();//取出接收数据的内容
int length = data.length;//取出数据的长度
String result = new String(data,0,length);
System.out.println(result);//打印接收的数据
socket.close();
}
}
结果:
2.TCP协议方式:
ServerDemo.java
package ch.hp.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* socket 网络编程之TCP协议 服务端
*/
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(7777);
Socket socket = serverSocket.accept();//调用accept拿到一个socket对象
//拿到输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
os.write("我是服务端响应道客户端的数据".getBytes());
//读取客户端发送的请求参数
byte[] bytes = new byte[1024];
int len = is.read(bytes);
//将读取的数据打印出来
String result = new String(bytes,0,len);
System.out.println(result);
}
}
ClientDemo.java
package ch.hp.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* socket 网络编程之TCP协议 客户端
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建Socket对象,传入主机ip和端口
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),7777);
//输入流,用于读取服务端的数据
InputStream is = socket.getInputStream();
//输出流,用于向服务端写数据
OutputStream os = socket.getOutputStream();
//读取服务端的数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
//将读取的数据打印出来
String result = new String(bytes,0,len);
System.out.println(result);
//向服务端写数据
os.write("我是客户端写入服务端的数据".getBytes());
socket.close();
}
}
TCP协议方式,注意需要先运行服务端;结果