网络编程
计算机网络
把分布在不同地理区域的独立功能的计算机,通过通信设备与线路连接起来,由于功能完善的软件实现资源共享和信息传递的系统。
网络编程的目的:直接或间接地通过网络通讯协议与其他计算机进行通讯。
网络编程中的两个主要问题:
1.如何准确的定位网络上一台或多台主机,即IP地址。
2.找到主机后如何可靠高效的进行数据传输,即通讯协议。
ip/端口
IP(计算机)/端口号(电脑上的软件)
IP地址:InetAddress可以唯一的标识Internet上的主机
分类方式1:IPV4(16位)和IPV6(64位)
特点:不易记忆
分类方式2:公网地址和局域网地址
域名:DNS 管理全球的域名
端口号:
公认端口号(0-1023)
注册端口号(1024-49151)
动态/私有端口(49152-65535)
端口号与IP地址组合得出一个网络套接字
实例:
public class Demo1 {
public static void main(String[] args) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress.getHostAddress());//获得主机地址
System.out.println(inetAddress.getHostName());//获得主机名
}
}
运行结果:
网络通信协议
计算机网络中实现通信必须有一些约定,即通信协议。
例如:代码结构(传输内容),传输的速度,出错控制…
传输控制协议 TCP(Transmission Control Protocol)
用户数据报协议 UDP(User Datagram Protocol)。
TCP通信特点
1.传输数据之前客户端与服务器必须建立联系,即三次握手。
(1)客户端发起请求
(2)服务器给客户端的确认回复
(3)客户端给服务器的确认回复
-
传输数据可靠,可以传输大量数据但效率低。
-
断开连接需要四次挥手。
(1)客户端向服务器发送断开请求。
(2)服务器向客户端发送确认信息。
(3)服务器端向客户端发送断开请求。
(4)客户端向服务器端发送断开确认。
UDP通信特点
将数据,数据源,目标地址封装在数据包(报)中。
无需建立连接,直接发出,每个数据包最大64kb。
因无需建立连接,不可靠,但传输速度快。
java中TCP协议实现通信
Socket 网络套接字 表示客户端 ,里面封装服务器IP,端口。
ServerSocet 表示服务器端,监听客户端的连接。
实例1:(通信方式1)
//创建服务器
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);
System.out.println("客户端请求建立连接");
ss.accept();//阻塞式监听
System.out.println("建立连接成功");
}
//创建客户端,创建时需要建立连接
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.3.105",9999);
}
‘运行结果:
实例2:
//创建服务器
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9988);
System.out.println("客户端请求建立连接");
Socket s = ss.accept();//阻塞式监听
System.out.println("建立连接成功");
//接收客户端发送的信息
InputStream is = s.getInputStream();
byte[] b = new byte[1024];
int length = is.read(b);//将客户端发送的消息写入到数组中
//将byte数组转为字符串
String str = new String(b, 0, length, "utf-8");
System.out.println("服务器接受到的客户端信息为" + str);
}
//创建客户端,创建时需要先建立连接
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.3.109", 9988);
OutputStream os = s.getOutputStream();
String str = "Hello,服务器我来了";
os.write(str.getBytes("UTF-8"));
os.close();
s.close();
}
运行结果:
实例3:(通信方式2)
//创建服务器
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9988);
Socket s = ss.accept();
DataInputStream dis = new DataInputStream(s.getInputStream());
String string = dis.readUTF();
System.out.println("客户端说:"+string);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
Scanner input = new Scanner(System.in);
System.out.println("请服务器端输入:");
String str = input.next();
dos.writeUTF(str);
}
//创建客户端,创建时需要建立连接
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.3.109",9988);
//数据输出字节流
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
Scanner input = new Scanner(System.in);
System.out.println("请客户端输入:");
String str = input.next();//阻塞式的等待
dos.writeUTF(str);
DataInputStream dis = new DataInputStream(s.getInputStream());
String string = dis.readUTF();
System.out.println("服务器端说:"+string);
dos.close();
s.close();
}
运行结果:
java中UDP协议实现通信
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(9988);
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp);//接收数据
String s = new String(dp.getData(),0, b.length);
System.out.println(s);
}
public static void main(String[] args) throws IOException {
//发送端Socket只管发送数据
DatagramSocket ds = new DatagramSocket();
//封装数据报
byte[] b = "hello,服务器".getBytes("utf-8");
InetAddress ia = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(b, b.length,ia,9988);
ds.send(dp);//发送数据
}
运行结果:
注意
不论UDP实现通信还是TCP实现通信,都需要有服务器端先建立连接。