一、网络编程的介绍
网络编程就是通过Socket进行相关的网络通信,涉及到的知识有ip、端口号、网络协议等等。
二、网络编程三要素
1、IP
每个设备在网络中唯一的标识(ipconfig查看本机的ip, ping ip/域名地址 测试连接)
IP地址分类:
Ipv4 4个字节组成 4个0-255 总43亿 2011年已经用尽
Ipv6 8个字节组成 每组4个16进制
2、端口
每个应用程序在设备上唯一标识,编写网络应用需要绑定一个端口号,尽量使用1024以上的看,1024以下基本被系统占用
3、协议(重点)
为计算机网络中进行数据交换而建立的规则,标准或约定的集合
UDP--面向无连接,数据不安全,速度快,不区分客户端与服务端
TCP--面向连接(三次握手),数据安全,速度略低,分为客户端和服务端
对三要素进行举例子说明: 我要到酒店找你。ip就是酒店名称,端口号就是你住的房间号,协议就是我找到你后有一个规则该干嘛该干嘛
三、Socket介绍
Socket就是套接字:ip+端口号组成(一般组成一个网络入口。网络上具有唯一标识的ip地址和端口号组成在一起才能构成唯一能识别的标识符套接字)
网络通信就是Socket间的通信
数据在两个Socket间通过IO流传输
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP与Port
四、网络通信之UDP协议
UDP协议:面向无连接,数据不安全,速度快,不区分客户端与服务端
例子:Receive接收来自Send发送的消息(Receive需要先启动)
图解
Send.java
package com.xue.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 信息发送方
* 1、创建socket,发送数据
* 2、数据创建
* 3、创建packet,装数据
* 4、发送数据
* 5、关闭socket
* @author
*
*/
public class Send {
public static void main(String[] args) throws Exception {
//1、创建socket,发送数据
DatagramSocket socket = new DatagramSocket(); //定义一个socket,发送数据
//2、数据创建
String str = "I am XiaoMing!";
//3、创建packet,装数据
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345); //定义一个packet,装数据
//4、发送数据
socket.send(packet);
//5、关闭socket
socket.close();
}
}
Receive.java
package com.xue.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 信息接收方
* 1、创建socket,接收数据
* 2、创建packet,装数据
* 3、取出数据放入packet
* 4、处理数据
* 5、关闭socket
* @author
*
*/
public class Receive {
public static void main(String[] args) throws Exception{
//1、创建socket,接收数据
DatagramSocket socket = new DatagramSocket(12345);
//2、创建packet,装数据
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
//3、取出数据
socket.receive(packet);
//4、处理数据
String str = new String(packet.getData(), 0, packet.getLength());
System.out.println("IP:" + packet.getAddress() + " 端口号:" + packet.getPort() +": " + str);
//5、关闭socket
socket.close();
}
}
对上面例子进行改进,接收方不断接收发送方消息,改进部分代码如下:
/*发送方改进输入数据代码*/
Scanner scan = new Scanner(System.in);
while (true) {
String str = scan.nextLine();
if (str.equals("quit")) {
break;
} else {
packet = new
DatagramPacket(str.getBytes(), str.getBytes().length,
InetAddress.getByName("127.0.0.1"), 6666);
//4、发送数据
socket.send(packet);
}
}
/*接收方改进接收数据代码*/
while (true) {
//3、取出数据
socket.receive(packet);
//4、处理数据
String str = new String(packet.getData(), 0, packet.getLength());
System.out.println("IP:" + packet.getAddress() + " 端口号:" +
packet.getPort() +": " + str);
}
五、网络通信之TCP协议
TCP协议:面向连接(三次握手),数据安全,速度略低,分为客户端和服务端
图解
例子:服务端与客户端的交流
Server.java
package com.xue.socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* 1、创建socket
* 2、接收请求
* 3、处理请求
* 4、关闭socket
* @author
*
*/
public class Server {
public static void main(String[] args) throws Exception {
//1、创建socket
ServerSocket socket = new ServerSocket(12345);
//2、接收请求
Socket accept = socket.accept();
//3、获取输入输出流
InputStream ip = accept.getInputStream();
OutputStream op = accept.getOutputStream();
//4、处理请求
op.write("OK".getBytes());
byte[] by = new byte[1024];
int len = ip.read(by);
System.out.println(new String(by, 0, len));
//4、关闭socket
socket.close();
}
}
Client.java
package com.xue.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* 1、创建socket
* 2、获取输入输出流
* 3、发送请求
* 4、关闭socket
* @author
*
*/
public class Client {
public static void main(String[] args) throws Exception {
//1、创建socket
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 12345);
//2、获取输入输出流
InputStream ip = socket.getInputStream();
OutputStream op = socket.getOutputStream();
//3、发送请求
byte[] by = new byte[1024];
int len = ip.read(by);
System.out.println(new String(by, 0, len));
op.write("hello".getBytes());
//4、关闭socket
socket.close();
}
}
改善,上面是对字节流的操作,下面直接将字节流转为字符串,操作简单方便(对服务器引入多线程)
Client.java
package com.xue.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getLocalHost(), 12345);
BufferedReader buf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream pr = new PrintStream(socket.getOutputStream());//获得输出流
pr.println("我爱你");
System.out.println(buf.readLine());
socket.close();
}
}
Server.java
package com.xue.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(12345);
while (true) {
final Socket socket = server.accept(); //接受客户端请求
new Thread() {
public void run() { //开启一条线程
try {
BufferedReader br = new
BufferedReader(new
InputStreamReader(socket.getInputStream()));//获得客户端输入流
PrintStream pr = new PrintStream(socket.getOutputStream());//获得客户端输出流
String str = br.readLine();
System.out.println(br.readLine());
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
}