一.网络编程的三要素:
1. ip:一个计算机标识,每个计算机只有一个,不可重复
2. 端口:每个程序会对应一个端口,用来通信,
有效端口:0~65535,其中0~1024系统使用或保留端口
3. 协议:TCP,UDP
协议TCP和UDP的区别:
UDP:
把数据打成一个数据包,不需要建立链接
数据包大小有限制,不能超过64K
无连接,属于不可靠协议(数据可能丢失)
无连接,效率高
TCP:
需要建立连接,形成通道
数据可通过连接通道进行传输,无大小限制
有链接,属于可靠协议
有链接,效率低
1.InetAdress:IP地址描述类(对IP地址的获取和操作)
public static InetAddress getByName(String host)( host: 可以是主机名,也可以是IP地址的字符串表现形式)
public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。
public String getHostName()获取此 IP 地址的主机名。
socket通信机制:
通信两端都有Socket
网络通信其实就是Scoket通信
数据在两个Scoket间通过IO传输
3.UDP通信步骤:
发送端步骤:
/*
* UDP发送数据的步骤:
* A:创建UDP发送数据端Socket对象
* B:创建数据包,并给出数据,把数据打包
* C:通过Socket对象发送数据包
* D:释放资源
*/
接收端步骤:
/*
* UDP协议接收数据步骤:
* A:创建UDP接收数据端Socket对象
* B:创建一个接收数据的数据包
* C:接收数据,数据在数据包中
* D:解析数据包,并把数据显示在控制台
* E:释放资源
*/
// 1.创建发送端socket对象
DatagramSocket ds = new DatagramSocket();
InetAddress address = InetAddress.getByName("192.168.20.254");
int port = 9999;
// 2.创建键盘录入对象
Scanner sc = new Scanner(System.in);
String line;
while ((line = sc.nextLine()) != null) {
// 键盘录入的数据line
byte[] buf = line.getBytes();
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length, address, port);
// 发送数据包
ds.send(dp);
// 1.创建发送端socket对象
DatagramSocket ds = new DatagramSocket();
InetAddress address = InetAddress.getByName("192.168.20.254");
int port = 9999;
// 2.创建键盘录入对象
Scanner sc = new Scanner(System.in);
String line;
while ((line = sc.nextLine()) != null) {
// 键盘录入的数据line
byte[] buf = line.getBytes();
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length, address, port);
// 发送数据包
ds.send(dp);// 创建接收端socket对象
DatagramSocket ds = new DatagramSocket();
// 接受来自客户端的数据
while (true) {
// 创建数据包
byte[] buf = new byte[1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length);
// 接受来自客户端的数据
ds.receive(dp);
// 解析数据包中的数据
byte[] data = dp.getData();
int len = dp.getLength();
System.out.println(new String(data, 0, len));
4.TCP通讯步骤
/*
* TCP协议发送数据步骤:
* A:创建TCP协议发送端Socket对象
* 指定服务器IP及端口
Socket sk = new Socket("192.168.3.120" , 9527) ;
* B:获取输出流,并写数据
OutputStream outputStream = sk.getOutputStream() ;
outputStream.write("hello,TCP我来了".getBytes()) ;
* C:释放资源
sk.close() ;
*
* java.net.ConnectException: Connection refused: connect
* TCP协议是不能直接运行客户端的,必须先运行服务器。因为他是一种可靠的协议。
*/
接收端:
/*
* TCP协议接收数据步骤:
* A:创建TCP协议接收端Socket对象
ServerSocket ss = new ServerSocket(9527) ;
* B:监听客户端连接
Socket sk = ss.accept() ;
* C:获取输入流,并读取数据,显示在控制台
// 读取数据
byte[] bytes = new byte[1024] ;
int len = inputStream.read(bytes) ;
// public InetAddress getInetAddress()获取IP地址
InetAddress inetAddress = sk.getInetAddress() ;
String ip = inetAddress.getHostAddress() ;
// 输出
System.out.println(ip + "发来数据是: " + new String(bytes , 0 , len));
* D:释放资源
sk.close() ;
*/
//创建tcp客户端socket对象
Socket sk = new Socket("192.168.20.254", 10010);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
String line;
while ((line=sc.nextLine())!=null) {
//往通道中写数据,一次写一行
bw.write(line);
bw.newLine();
bw.flush();
}
sk.close(); //创建服务器端的socket对象
ServerSocket ss = new ServerSocket(10010);
//监听客户端连接
Socket sk = ss.accept();
//从sk的通道中读取数据,一次读取一行
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
//一次读取一行数据
String line;
while ((line=br.readLine())!=null) {
//line就是已经读取到的数据,我们现在需要将line这个数据写入文件
bw.write(line);
bw.newLine();
bw.flush();
}
sk.close();
bw.close();
br.close();