一、网络编程入门
1、软件结构
网络编程就是计算机和计算机之间的数据交互。
C/S结构:
客户端/服务器: 微信 英雄联盟 tlias
优点:对网络要求低
缺点:需要下载和更新,占用空间大
B/S结构:
浏览器/服务器 : 淘宝 京东
优点:开发和使用方便
缺点:对网络要求高
2、网络编程三要素
IP地址
IP是网络中计算机的唯一标识。
IPV4:
由32位二进制组成,一共可以分配40多亿个不重复的ip地址,这些IP已经不够全世界的使用了。
IPV6:
由128位二进制组成,可以给地球上的每一粒沙子分配一个ip。
如何查看电脑ip:
在命名行窗口中输入: ipconfig
特殊ip写法:
如果要表示本机ip,可以直接写ip数值,也可以用以下两个写法表示
localhost
127.0.0.1
端口号
端口号是软件的唯一标识,每个软件都有一个自己的端口号
取值范围:
0 ~ 65535 其中0~1023范围建议留给系统软件使用
传输协议
协议是数据传输的方式
TCP[学习]
面向连接,数据发送安全,效率低
UDP
面向无连接,数据发送不安全,效率高,每个数据包最大64K
3、InetAddress类
代表IP,可以获取局域网中电脑的ip地址。
方法介绍
InetAddress类成员方法
static InetAddress getLocalHost()
获得本地主机IP地址对象
static InetAddress getByName(String host)
根据IP地址字符串或主机名获得对应的IP地址对象
String getHostName() 获得主机名
String getHostAddress() 获得IP地址字符串
代码演示:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test01 {
public static void main(String[] args) throws UnknownHostException {
//getLocalHost() : 获得本地主机IP地址对象
//InetAddress ip = InetAddress.getLocalHost();
//getByName(String host) :根据IP地址字符串或主机名获得对应的IP地址对象
InetAddress ip = InetAddress.getByName("192.168.171.50");
//String getHostName() 获得主机名
String s1 = ip.getHostName();
System.out.println(s1); //DESKTOP-A119FQ3
//getHostAddress() 获得IP地址字符串
String s2 = ip.getHostAddress();
System.out.println(s2); //192.168.171.50
}
}
3、TCP通信程序
1、TCP操作概述
在java中有Socket类,叫套接字,可以完成TCP方式数据传输。
2、TCP通信案例
客户端发送数据
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Test客户端 {
public static void main(String[] args) throws IOException {
//创建客户端对象
//第一个参数表示要连接的服务器的ip
//第二个参数表示要连接的服务器的端口
Socket s = new Socket("192.168.171.32",10000);
//准备数据
String str = "晚上11点我去你家~";
//获取输出流
OutputStream os = s.getOutputStream();
//输出数据
//把字符串变成字节数组输出
os.write(str.getBytes());
//关闭资源
s.close();
}
}
服务端接收数据
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Test服务端 {
public static void main(String[] args) throws IOException {
//创建服务器对象
//参数代表服务器自己的端口号
ServerSocket ss = new ServerSocket(11002);
//接受客户端连接
Socket s = ss.accept(); //阻塞方法,如果连接不上就会一直等待
//先创建一个字节数组准备接受数据
byte[] bys = new byte[1024];
//获取输入流
//不管是客户端还是服务器,所有的流都使用Socket对象来获取
InputStream is = s.getInputStream();
//读取数据(因为服务器只发了一句话,一次读取即可。
//不需要循环,并且也不能写循环,为什么不能后面说)
int len = is.read(bys); 阻塞方法,如果读取不到就会一直等待
//打印读取到的内容
System.out.println(new String(bys, 0, len));
//关闭资源
//ss.close(); 服务器是不需要关的
}
}
3、模拟网络聊天
使用循环完成客户端和服务器端多次会话,因为代码的局限性,我们现在只能完成客户端和服务器一人一句的聊天。不能一个人一次发送多句话。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Test客户端 {
public static void main(String[] args) throws IOException, InterruptedException {
//创建客户端对象
//第一个参数表示要连接的服务器的ip
//第二个参数表示要连接的服务器的端口
Socket s = new Socket("192.168.171.32",11002);
while(true) {
//发送数据
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
OutputStream os = s.getOutputStream();
os.write(str.getBytes());
//接受数据
byte[] bys = new byte[1024];
InputStream is = s.getInputStream();
int len = is.read(bys);
System.out.println(new String(bys, 0, len));
}
//关闭资源
//s.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Test服务端 {
public static void main(String[] args) throws IOException {
//创建服务器对象
//参数代表服务器自己的端口号
ServerSocket ss = new ServerSocket(11002);
//接受客户端连接
Socket s = ss.accept();
while(true) {
//读取数据
byte[] bys = new byte[1024];
InputStream is = s.getInputStream();
int len = is.read(bys);
System.out.println(new String(bys, 0, len));
//发送数据
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
OutputStream os = s.getOutputStream();
os.write(str.getBytes());
//关闭资源
//ss.close(); 服务器是不需要关的
}
}
}