1.网络编程三要素:
(1)IP地址
概念:网络计算机的唯一标识,将IP地址上的每个字节上的数据换算成十进制,然后,分开来表示:“点分十进制”
组成:网络号段+主机后段
A类:第一段号为网络断号+后三段主机后段(一个网络号:256*256*256)
B类:前二段号为网络断号+后二段主机后段(一个网络号:256*256)
C类:第三段号为网络断号+后一段主机后段(一个网络号:256,最为常见)
10.X.X.X,192.168.X.X 是私有地址,在互联网上不适用,而被用在局域网在。
(1)IP地址
概念:网络计算机的唯一标识,将IP地址上的每个字节上的数据换算成十进制,然后,分开来表示:“点分十进制”
组成:网络号段+主机后段
A类:第一段号为网络断号+后三段主机后段(一个网络号:256*256*256)
B类:前二段号为网络断号+后二段主机后段(一个网络号:256*256)
C类:第三段号为网络断号+后一段主机后段(一个网络号:256,最为常见)
10.X.X.X,192.168.X.X 是私有地址,在互联网上不适用,而被用在局域网在。
两个dos命令:ipconfig 查看本机IP地址
ping 后面跟IP地址,测试本机通信指定IP地之间的通信是否有问题
特殊的IP地址:127.0.0.1 回环地址(表示本机)
X.X.X.255 X.X.X.0 分别是广播地址和网络地址,不建议使用
Java中提供InetAddress类来操作IP
如果一个类中没有构造方法,以下原因:
A:成员全部是静态的(Math,Arrays,Collections)
B:单例设计模式(Runtime)
C:类中有静态方法返回该类的对象(InetAddress)
方法: InetAddress ia = InetAddress.getByName("Lenovo-PC");
//获取主机名和IP地址
String name = ia.getHostName();
String ip = ia.getHostAddress();
(2)端口
概念:正在运行的程序的标识。有效端口:0~65535,其中0-1024系统使用或者做为保留端口。
(3)网络协议
UDP:把数据打包,数据有限制,每次不能超过64k,不建立连接,速度快,不可靠。
TCP:建立连接通道,在连接中建立大量数据传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率会低。
举例:UDP:发短信 TCP:打电话
2.Socket网络编程(套接字编程)
(1)概念:包含IP+端口, 通信两端都要有Scoket,网络通信其实就是Socket间的通信,数据底层其实就是IO流。
ping 后面跟IP地址,测试本机通信指定IP地之间的通信是否有问题
特殊的IP地址:127.0.0.1 回环地址(表示本机)
X.X.X.255 X.X.X.0 分别是广播地址和网络地址,不建议使用
Java中提供InetAddress类来操作IP
如果一个类中没有构造方法,以下原因:
A:成员全部是静态的(Math,Arrays,Collections)
B:单例设计模式(Runtime)
C:类中有静态方法返回该类的对象(InetAddress)
方法: InetAddress ia = InetAddress.getByName("Lenovo-PC");
//获取主机名和IP地址
String name = ia.getHostName();
String ip = ia.getHostAddress();
(2)端口
概念:正在运行的程序的标识。有效端口:0~65535,其中0-1024系统使用或者做为保留端口。
(3)网络协议
UDP:把数据打包,数据有限制,每次不能超过64k,不建立连接,速度快,不可靠。
TCP:建立连接通道,在连接中建立大量数据传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率会低。
举例:UDP:发短信 TCP:打电话
2.Socket网络编程(套接字编程)
(1)概念:包含IP+端口, 通信两端都要有Scoket,网络通信其实就是Socket间的通信,数据底层其实就是IO流。
UDP:
* 发送数据:
* A:创建发送端Socket对象
* B:创建数据,将数据打包
* C:调用Socket对象的发送方法发送发到数据包
* D:释放资源
* 类 DatagramSocket 此类表示用来发送和接收数据报包的套接字。
* 发送数据:
* A:创建发送端Socket对象
* B:创建数据,将数据打包
* C:调用Socket对象的发送方法发送发到数据包
* D:释放资源
* 类 DatagramSocket 此类表示用来发送和接收数据报包的套接字。
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
byte[] bytes = "yanxi love you".getBytes();
int length = bytes.length;
InetAddress address = InetAddress.getByName("172.20.0.129");
int port = 10086;
//数据打包
DatagramPacket dp =new DatagramPacket(bytes,length,address,port);
//发送数据
ds.send(dp);
//释放资源
ds.close();
* 接收数据:
* A:创建接收端的Socket对象
* B:创建数据包,用来接收数据
* C: 接受数据
* D:解析数据,显示在控制台
* E:释放资源
//创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据包,用来接收数据
byte[] bytes = new byte[1024];
int length = bytes.length;
DatagramPacket dp = new DatagramPacket(bytes,length);
//接受数据
ds.receive(dp);//阻塞式方法
//获取对方的IP
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
String name = address.getHostName();
//解析数据,显示在控制台
int len = dp.getLength();
byte[] bytes1 = dp.getData();
String s = new String(bytes1,0,len);
System.out.println(name+"--" +ip +"--" + s);
//释放资源
ds.close();
TCP:(注意:要先开接收端,接下来在开发送端)
* TCP接收数据:
* A:创建接收端的Socket对象
* B:监听客户端
* C:获取输入流,读取数据
* D:释放资源
* A:创建接收端的Socket对象
* B:监听客户端
* C:获取输入流,读取数据
* D:释放资源
ServerSocket ss = new ServerSocket(8888);
//返回的直接是一个Socket对象
Socket s = ss.accept();
InputStream is = s.getInputStream();
//返回的直接是一个Socket对象
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes); //阻塞式方法
System.out.println(new String(bytes,0,len));
int len = is.read(bytes); //阻塞式方法
System.out.println(new String(bytes,0,len));
s.close();
* TCP发送数据
:
* A:创建发送端的Socket对象,指定IP,端口
* 这一步成功,说明已经建立了连接
* B:获取输入流,写数据
* C:释放资源
* A:创建发送端的Socket对象,指定IP,端口
* 这一步成功,说明已经建立了连接
* B:获取输入流,写数据
* C:释放资源
Socket socket = new Socket("172.20.0.129",8888);
OutputStream os = socket.getOutputStream();
os.write("yanxi love you".getBytes());
socket.close();
os.write("yanxi love you".getBytes());
socket.close();
在用TCP来进行上传文件,并对文件进行复制时,客户端得不到反馈数据,因为读取文本文件是可以以null作为结束信息的,但是,通道是不能这样结束信息的,所以服务器根本不知道已经读完了,导致两个互相等待。
解决方法一:在客户端传数据可以多写一句话,来作为结束语句。(不好)
解决方法二:Socket对象提供了一种终止功能,Shutdo()通知服务器终止传输。
解决方法一:在客户端传数据可以多写一句话,来作为结束语句。(不好)
解决方法二:Socket对象提供了一种终止功能,Shutdo()通知服务器终止传输。
一个服务器多个客户端的方法:
方法一:将服务器从监听开始用while循环改进。(不好)
方法二:开启一个线程,每次传入要监听的Socket,然后服务器在调用start执行。
方法一:将服务器从监听开始用while循环改进。(不好)
方法二:开启一个线程,每次传入要监听的Socket,然后服务器在调用start执行。