网络编程基础知识大全
扫描二维码
随时随地手机看文章
============================
1. IP地址
IP地址,就是每一个接入互联网的主机的唯一身份标识,IP地址
0-255组成的,分成了4段,每段0-255
IP地址分类:ABCDE
局域网:192.168开头
本地回环地址:127.0.0.1 每一个电脑,网卡正常工作,主机的IP就是127.0.0.1
IP地址这个事物也是对象,对IP地址对象的描述类
java.net.InetAddress
私有构造方法,静态方法返回本类对象的
static InetAddress getLocalHost() 获取本地主机IP地址对象
这个方法在哪个机器上运行,那个机器就是本地主机
InetAddress类中的两个方法 getHostAddress()通过IP地址对象,获取IP地址
InetAddress类中的两个方法 getHostName()通过IP地址对象,获取主机名
如果获取一台主机的IP或者主机名,必须先获取到一台主机的IP对象(InetAddress)
获取远程主机IP地址对象
static InetAddress getByName(String host) 参数,传递主机名,传递IP地址
/*
* 获取本地主机IP地址对象
* InetAddress类的静态方法 getLocalHost
*/
import java.net.*;
public class InetAddressDemo {
public static void main(String[] args)throws UnknownHostException {
InetAddress i = InetAddress.getLocalHost();
System.out.println(i);//机器名/IP地址
//获取主机名
String name = i.getHostName();
//获取IP地址
String ip = i.getHostAddress();
System.out.println(name+"..."+ip);
}
}
//===================================================
2. 端口号
操作系统的一个数字物理标识
看成是进入或者出去操作系统的一个门牌号
我邮寄一个包裹 昌平建材城西路100号
收件:大兴黄村北路200号
端口号 0-1024操作系统保留号
最大65535
常见端口号:
80 http访问互联网的默认端口号
http://www.baidu.com:80
21 FTP数据传输端口号
8080 Javaweb服务器默认端口号
3306 MySQL数据的连接端口号
1521 Oracle数据库连接端口号
1433 MS SQLServer数据库连接端口号
//===================================================
3. 传输协议
发送,接受两个方面约定好的内容
两个人打电话,相约晚上11点-11点30分可以通话,语音采用中文
UDP -- 面向无连接协议
通信双方不需要连接
不需要连接,不可靠,丢数据
连接效率很高
不允许传输大数据,限制在64KB以内
TCP -- 面向连接协议
通信双方需要建立连接,三次握手,效率底下
连接,安全可靠协议,不丢失数据
适合于大数据传输
//===================================================
4. Socket服务
Socket就是为网络服务提供的一种机制
通信的两端都有Socket
提供接收和发送功能的
写功能的时候,接收还是发送的,必须有Socket服务
UDP的传输
分为发送端和接收端
发送端:
A 发送的数据封包 -- 封装数据包的类,DatagramPacket
B 将封装好的数据包,交给Socket进行发送 -- DategramSocket
C 关闭资源
接收端:
A. 接收数据包,Socket接收
B. 拆包
C. 拆包后的信息,显示出来
D. 关闭资源
DategramPacket数据包:
构造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port)
字节数据 长度 IP地址 端口号
构造方法DatagramPacket(byte[] buf, int length) 接收
int getLength() 接收数据包中,数组的有效个数
int getPort()获取发送端口号
InetAddress getAddress()返回发送端的IP地址对象
DatagramSocket发送包,接收包
构造方法,发送时候空参数的
发送方法,send(数据包)
构造DatagramSocket(int port) 接收,传递端口号
接收的方法 receive(数据包)
/*
* UDP发送端
*/
import java.net.*;
import java.util.Scanner;
public class UDPSend {
public static void main(String[] args) throws Exception{
new Scanner(System.in).nextLine();
//将数据封装到数据包 DategramPacket
byte[] bytes = "你好UDP".getBytes();
DatagramPacket dp = new
DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"),10000);
//创建投递服务的Socket对象,DatagramSocket
DatagramSocket ds = new DatagramSocket(8000);
//将数据包,交给Socket发送
ds.send(dp);
//关闭资源
ds.close();
}
}
/*
* UDP的接收端
*/
import java.net.*;
public class UDPReceive {
public static void main(String[] args) throws Exception{
//创建投递服务的Socket对象
DatagramSocket ds = new DatagramSocket(10000);
//定义数据包,接收
byte[] bytes = new byte[10];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//Socket接收数据包
ds.receive(dp);
//获取数组中的有效个数
int length = dp.getLength();
//获取端口号
int port = dp.getPort();
//获取发送端的IP地址对象
InetAddress i = dp.getAddress();
String ip = i.getHostAddress();
//输出全部的信息
System.out.println(new String(bytes,0,length)+"..."+ip+"..."+port);
//关闭资源
ds.close();
}
}
//===================================================
5. TCP
客户端和服务器
建立连接,客户端必须连接服务器,否则程序无法运行
客户端的Socket服务,Socket
服务器端的Socket服务,ServerSocket
Socket类构造方法 Socket(String host, int port)
构造方法,一旦执行,就会去连接服务器,如果没有服务器,抛出异常
OutputStream getOutputStream() 通过Socket对象获取字节输出流
InputStream getInputStream()通过Socket对象获取字节输入流
ServerSocket类构造方法ServerSocket(int port)
Socket accept()获取客户端的连接对象,这个方法告诉服务器,是哪一个客户端连接的
客户端通过自己Socket获取字节输出流,向服务器发送数据
服务器通过客户端连接对象Socket获取字节输入流,读取客户端发送的数据
服务器通过客户端连接对象Socket获取字节输出流,向客户端发送数据
客户端通过字节的Socket对象获取字节输入流,读取服务器发回的数据
/*
* TCP的客户端
*/
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args)throws Exception {
//创建客户端的Socket对象
Socket s = new Socket("127.0.0.1",10000);
//将数据传输到服务器,字节输出流
OutputStream out = s.getOutputStream();
//写,字节数组
out.write("你好TCP".getBytes());
//客户端获取服务器发回的信息,字节输入流
InputStream in = s.getInputStream();
byte[] bytes = new byte[10];
int len = 0 ;
len = in.read(bytes);
System.out.println(new String(bytes,0,len));
//关闭资源
s.close();
}
}
/*
* TCP服务器
*/
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) throws Exception{
//创建服务器的Socket服务
ServerSocket ss = new ServerSocket(10000);
//知道是哪个客户端连接的
Socket s = ss.accept();//线程等,等着客户端连接
//有了客户端对象Socket,完全可以使用客户端连接对象,获取IO流
//获取字节输入流
InputStream in = s.getInputStream();
byte[] bytes = new byte[10];
int len = 0 ;
len = in.read(bytes);
System.out.println(new String(bytes,0,len));
//服务器回客户端一个信息,谢谢收到了
OutputStream out = s.getOutputStream();
out.write("谢谢收到了".getBytes());
s.close();
ss.close();
}
}
//===================================================
6. TCP的案例
键盘录入字母,发送给服务器,服务器转成大写字母,回传客户端,客户端读取服务器发回的大写字母
通过案例暴露很多问题
A. 键盘读取 OK
B. 读取到的键盘,发出去没有,OK
C. 服务器收到了吗,服务器收到了 readLine()方法线程阻塞,等着读 OK
D. 服务器大写数据发回了吗 OK
E. 客户端读取到了 OK
/*
* 转成大写客户端
*/
import java.io.*;
import java.net.*;
public class TCPClientToUpperCase {
public static void main(String[] args) throws Exception{
//建立Socket服务
Socket s = new Socket("127.0.0.1",10000);
//读取键盘输入
BufferedReader bfr = new
BufferedReader(new InputStreamReader(System.in));
//建立字节流对象,转成字符流,读取服务器发回的大写字母
BufferedReader bfrin =
new BufferedReader(new InputStreamReader(s.getInputStream()));
//向服务器发送数据,采用打印流
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line = bfr.readLine())!=null){
if("over".equals(line))break;
out.println(line);
//将数据打印到服务器,读取服务器回来的大写
String server = bfrin.readLine();
System.out.println("大写字母是::"+server);
}
bfr.close();
s.close();
}
}
/*
* 转换大写服务器
*/
import java.io.*;
import java.net.*;
public class TCPServerToUpperCase {
public static void main(String[] args) throws Exception{
//建立服务器Socket,获取客户端连接对象
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();
//读取客户端的小写字母,都是文本,按行读
BufferedReader bfrin = new
BufferedReader(new InputStreamReader(s.getInputStream()));
//创建打印流对象,将大写数据,写回客户端
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line = bfrin.readLine())!=null){
if("over".equals(line))
break;
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}
//===================================================
7. TCP文本上传
将C盘上的源文件,通过TCP服务器传递到D盘upload目录中
客户端
IO读取文本文件
打印流,将文本打印到服务器
读取上传成功四个字
服务器
读取客户端的文本文件,保存到目的中(D盘)
将上传成功四个字,会给客户端
服务器停不下来
服务器读取的是Socket中的字节流null;
客户端,和服务器之间,约定一个结束标记
java工程师们很善良,定义好了结束标记
Socket类中的方法 void shutdownOutput()
/*
* TCP文本上传客户端
*/
import java.io.*;
import java.net.*;
public class TCPCilentUpLoad {
public static void main(String[] args) throws Exception{
Socket s = new Socket("127.0.0.1", 10000);
//字符流,读取文本文件
BufferedReader bfr = new BufferedReader(new FileReader("c:\1.txt"));
//将文本使用打印流,打印到服务器
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line=bfr.readLine())!=null){
out.println(line);
}
//out.println("*&^%$#@@#$TRJHGFD&%^$#@");
s.shutdownOutput();
//读取服务器的上传成功
InputStream in = s.getInputStream();
byte[] bytes = new byte[10];
int len = in.read(bytes);
System.out.println("服务器说::"+new String(bytes,0,len));
bfr.close();
s.close();
}
}
*
* 文本上传服务器
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPServerUpLoad {
public static void main(String[] args)throws Exception {
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();
//读取客户端的数据,转换流
BufferedReader bfrin = new
BufferedReader(new InputStreamReader(s.getInputStream()));
//将目的封装成File对象
File file = new File("d:\upload");
if(!file.exists())
file.mkdirs();
//封装数据目的,使用打印流
//对上传的文件名修改
String filename = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999999)+".txt";
PrintWriter pw = new PrintWriter(new FileWriter(file+File.separator+filename),true);
String line = null;
while((line = bfrin.readLine())!=null){
pw.println(line);
}
//上传成功写回客户端
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
pw.close();
s.close();
ss.close();
}
}