文章目录
- 前言
- 一、什么是计算机网络?
- 二、网络通信的两个重要因素
-
- 三、Ip地址
- 1.InetAddress
- 2.Ip的分类
- 1)ipv4/ipv6
- 2)公网(互联网)和私网(局域网)
- 3.域名
- 四、端口
- 1.什么是端口
- 2.端口的分类
- 1)公有端口
- 2)程序注册端口
- 3)动态、私有端口
- 4)cmd查看端口指令
- 5)InetSocketAddress类
- 五、通信协议
-
- 六、TCP实现聊天
-
- 七、TCP实现上传
-
- 八、UDP实现聊天
-
- 总结
前言
在进行网页编程和多线程的学习之前需要对网络编程有足够的了解以及学会如何去运用进程序当中
一、什么是计算机网络?
在没有互联网之前,我们都是通过写书信然后由邮递员送到我们指定人的手上。随着科技的发展,现在已经是通过网络把整个地球连接起来了,正如人们说描述的那样形成了一个地球村。而计算机网络就是这个的代表物,两台电脑之间想要传输照片或者视频,就需要计算机网络来辅助。总而言之,计算机网络就是连接分散计算机设备以实现信息传递的系统。
二、网络通信的两个重要因素
1.通讯双方的地址
1)ip
例如:192.0.0.1
2)端口号
例如:8080、3306等
2.规则:网络协议
例如:TCP/IP HTTP,HTTPS,FTP....
三、Ip地址
1.InetAddress
因为没有构造方法所以不能通过new的方式创建一个InetAddress对象。
通过静态调用我们可以使用以下的方法来获取一台网络计算机的ip地址
1、getByName()
2、getLocalHost()
3、getAllByName()
4、getLoopbackAddress()
5、getByAddress()
2.Ip的分类
1)ipv4/ipv6
ipv4:32位,由四个字节组成,从0-255. 例如:127.0.0.1
ipv6:128位,8个无符号整数构成 例如:2022:1aaa:2bbb:3ccc:4ddd:0000:0000:12ab
2)公网(互联网)和私网(局域网)
通过a,b,c,d,e来划分
a类:1.0.0.0~126.0.0.0 子网:255.0.0.0
b类:128.0.0.0~191.255.0.0子网:255.255.0.0
c类:192.0.0.0~223.255.255.0子网:255.255.255.0
d类:多播地址
e类:保留地址
私有地址a,b,c
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
3.域名
通常ip不是很好记忆所以通过域名来记忆ip
四、端口
1.什么是端口
可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
2.端口的分类
端口是从0~65535,TCP和UDP是独立分开计算的所以总共会有65535*2的端口号
1)公有端口
从0~1023,比如HTTP:80,HTTPS:443,FTP:21,Telent:23
2)程序注册端口
1024~49151,分配给用户或者程序,如Mysql:3306,Tomcat:8080
3)动态、私有端口
从49152~65535
4)cmd查看端口指令
1、netstat -ano -------查看所有端口
2、netstat -ano|findstr ----------查看指定端口
3、tasklist|findstr --------------查看指定端口的进程
5)InetSocketAddress类
1、getAddress()
2、getHostString()
3、getHostString()
4、getPort()
5、getHostName()
五、通信协议
1.TCP
连接,稳定
有客户端和服务器端
传输完成,释放连接,效率低
1)三次握手
1、第一次握手
客户端发送请求给服务器端,希望与服务器端建立连接,并进入等待状态,等待服务器端确认
2、第二次握手
服务器端检测到客户端想要建立连接,经设置后表示收到客户端的信息并也想与客户端建立连接的信息
3、第三次握手
客户端接受服务器传来的信息后发送数据包给服务器端,服务器端检查如果正确,则客户端与服务器端建立连接,并可以进行数据的传输
2)四次挥手
1、第一次挥手
客户端发送请求想要终止连接的信息给服务器端,停止发送信息并进入等待状态,等待服务器端确认
2、第二次挥手
服务器端接受到客户端发来的停止连接信息,并传递消息给上层,然后进入关闭等待状态,虽然此时客户端已经不会发送数据到服务器端,但是服务器端仍能发送数据到客户端
3、第三次挥手
客户端接受到服务器端的信息后,进入最终等待状态。此时服务器端再次发送断开连接的信息,并等待客户端确认
4、第四次挥手
客户端接收到信息后发出确认断开连接的信息后,服务器端立刻关闭连接,但是客户端需要等待2*MSL(最长报文段寿命)的时间后,客户端才进入CLOSED状态关闭连接
2.UDP
不连接,不稳定
有客户端和服务器端,但是无明显区别
不管是否接收,都会先传输给你
六、TCP实现聊天
1.客户端
要与服务器端连接,就必须要获取到服务器的ip和端口,然后协议是TCP协议,然后然后通过套接字传入ip和端口,创建输出流,并写入要传输的内容
示例代码
public class Client {
public static void main(String[] args) throws IOException {
InetAddress localhost = InetAddress.getByName("localhost");
int port = 6693;
Socket socket = new Socket(localhost,port);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好啊".getBytes());
outputStream.close();
socket.close();
}
}
2.服务器端
创建套接字对象,并监听指定端口,创建输入流来获取客户端传来的数据,然后创建一个管道流保证不会乱码
示例代码
public class Service {
public static void main(String[] args) throws IOException,InterruptedException {
ServerSocket serverSocket = new ServerSocket(6693);
System.out.println("服务器开启ing......");
Thread.sleep(1200);
System.out.println("服务器已开启");
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
System.out.println("服务器接收成功");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while((len=inputStream.read(bytes))!=-1){
byteArrayOutputStream.write(bytes,0,len);
}
System.out.println("client: "+byteArrayOutputStream.toString());
Thread.sleep(5000);
byteArrayOutputStream.close();
inputStream.close();
serverSocket.close();
System.out.println("服务器关闭成功");
}
}
七、TCP实现上传
1.客户端
客户端需要通过字节或者字符输入流来获取图片或者文件,然后再通过输出流传入到套接字中
示例代码
public class Client {
public static void main(String[] args) throws IOException {
InetAddress localhost = InetAddress.getByName("localhost");
int port = 6693;
Socket socket = new Socket(localhost,port);
OutputStream os = socket.getOutputStream();
FileInputStream in = new FileInputStream("d:\\picture\\pixiv\\小奏.jpg");
byte[] bytes = new byte[1024];
int len = 0;
while ((len=in.read(bytes))!=-1){
os.write(bytes,0,len);
}
in.close();
os.close();
socket.close();
}
}
2.服务器端
创建套接字对象,并监听指定端口,创建输入流来获取客户端传来的数据,然后创建一个管道流保证不会乱码
示例代码
public class Service {
public static void main(String[] args) throws IOException,InterruptedException {
ServerSocket serverSocket = new ServerSocket(6693);
System.out.println("服务器开启ing......");
Thread.sleep(1200);
System.out.println("服务器已开启");
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
System.out.println("服务器接收成功");
FileOutputStream fo = new FileOutputStream(new File("test"));
int len = 0;
byte[] bytes = new byte[1024];
while((len=inputStream.read(bytes))!=-1){
fo.write(bytes,0,len);
}
System.out.println("client: "+fo.toString());
Thread.sleep(5000);
fo.close();
inputStream.close();
serverSocket.close();
System.out.println("服务器关闭成功");
}
}
八、UDP实现聊天
1.接收端/传输端1
与TCP协议不同的是,UDP只需要你知道对方的IP、端口就可以直接发送包给你但是并不需要你去确认收到,而且没有TCP的C/S或者B/S模式,接收端也可以是发送端
示例代码
public class Udp1 {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(6603);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String msg = reader.readLine();
byte[] buffer = msg.getBytes();
DatagramPacket packet =
new DatagramPacket(buffer,0,buffer.length,
new InetSocketAddress("localhost",6604));
datagramSocket.send(packet);
byte[] buffer2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(buffer2,0,buffer2.length);
datagramSocket.receive(packet2);
System.out.println(new String(buffer2, 0, buffer2.length));
reader.close();
datagramSocket.close();
}
}
2.接收端/传输端2
与1一样,创建接收和传输的内容即可,只不过是与1的代码相调换了顺序
示例代码
public class Udp2 {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(6604);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
datagramSocket.receive(packet);
System.out.println(new String(buffer, 0, buffer.length));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String msg = reader.readLine();
byte[] buffer2 = msg.getBytes();
DatagramPacket packet2 =
new DatagramPacket(buffer2,0,buffer2.length,
new InetSocketAddress("localhost",6603));
datagramSocket.send(packet2);
reader.close();
datagramSocket.close();
}
}
总结
网络变成更多的还是流的使用,而真正进行通讯的只是需要ip端口,和协议,然后通过套接字就可以实现了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)