信件对方的地址,对方的信息定位到特定个体。自己的地址自己的信息
有了以上这些要素后不考虑外部环境,这封信理论上就能发送到对方的手里了。
如果考虑外部环境呢?
将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机网络系统。
1.13网络编程的目的传播交流信息,数据交换,通信(都是同一个意思)
1.14 想要达到这个效果需要什么?1.如何准确的定位网络上的一台主机
地址:端口号 栗子如下
192.168.16.124:8080
定位到这个计算机上的某个程序
2.找到了这个主机上的某一程序,如何传输数据呢?
网络编程: TCP/IP协议 C/S架构
通信双方地址:
iP
端口号
192.168.16.124:5900
规则:网络通信的协议
TCP/IP
1.网络编程中有两个主要的问题
如何准确的定位到网络上的一台或多台主机
找到主机之后如何进行通信
2.网络编程中的要素
IP和端口号
网络通信协议 UDP,TCP
3.万物皆对象
1.3、IP地址 1.31 java中的关于ip地址的类InetAddress
本机地址:127.0.0.1和localhost
查询ip地址实践代码
package com.kuang.lession01;
import java.net.InetAddress;
import java.net.UnknownHostException;
//记得类名一致,不然会报错的
public class TestInetAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress inetAddress1=InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress1);
InetAddress inetAddress3=InetAddress.getByName("localhost");
System.out.println(inetAddress3);
InetAddress inetAddress4=InetAddress.getLocalHost();
System.out.println(inetAddress4);
//查询网络ip地址
InetAddress inetAddress2=InetAddress.getByName("www.baidu.com");//输入的是一个域名他会返回该域名对应的ip地址
System.out.println(inetAddress2);
//常用方法
System.out.println(inetAddress2.getAddress());//大一地址
System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
System.out.println(inetAddress2.getHostAddress());//ip
System.out.println(inetAddress2.getHostName());//域名或者自己电脑的名字
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1.33 ip地址分类
Ipv4/ipv6
IPV4 127.0.0.1,4字节组成。0~255,42亿,30亿在北美,亚洲4亿
IPV6:128位8个无符号整数!比如2001:obb2:aaaa:0015:0000:0000:1aaa:1312
公网(互联网)–私网(局域网)
ABCD类地址
192.168.xx.xx专门给组织内部使用的
小知识:域名是为了方便记忆,每个域名都对应一个IP地址,计算机识别域名映射的IP地址后在去执行操作的。
1.4端口 1.41 端口表示计算机上的一个程序的进程不同的进程有不同的端口号!用来区分软件!
规定端口号区间:0~65535
其中TCP/UDP不同协议端口号可以相同:TCP/UDP:65535*2 tcp:80 udp:80这是可以的
可是单个协议下,端口号不能冲突
公有端口 0~1024
HTTP:80
HTTPS:443
FTP:21
Telent:23
程序注册端口:1024 -49151,分配给用户或程序的
Tomcat:8080
MySQL:3306
Oracle:1521
动态、私有:49152~65535
netstat -ano //查看所有的端口
netstat -ano|findstr “5353”查看指定端口端口
注:要确定所有端口里面有5353,不然可能检索了个寂寞
tasklist|findstr "20568"查看指定端口的进程
注:要确定该端口有对应进程才行
确认方法如下
Ctrl+shift+ESC 打开任务管理器
小知识:通过修改hosts C:WindowsSystem32driversetchosts,可以直接修改127.0.0.1hostsname,的映射名字
网络地址小实践
稍微熟悉java中 InetSocketAddress类的用法
package com.kuang.lession01;
import java.net.InetSocketAddress;
public class TestInetSockeAddress {
public static void main(String[] args) {
// TODO Auto-generated method stub
InetSocketAddress socketAddress=new InetSocketAddress("127.0.0.1",8080);
InetSocketAddress socketAddress1=new InetSocketAddress("localhost",8080);
System.out.println(socketAddress);
System.out.println(socketAddress1);
System.out.println(socketAddress.getAddress());
System.out.println(socketAddress.getPort());//端口
System.out.println(socketAddress.getHostName());//地址
}
}
1.5 通讯协议
协议:约定就好比我们现在说普通话写汉字,你能看懂,如果我划拉的是西班牙语,可能你就看不懂了,更不用说进行通讯了
网络通讯协议:速率,传输码率,代码结构,传输控制…
两个重要协议:
TCP:用户传输协议
UDP:用户数据报协议
TCP
- 目的连接,且稳定
- 连接的三次握手
- 断开的四次挥手
连接最少需要三次,才能保证稳定连接!断开最少四次才能稳定断开!
连接的三次握手:A:请求连接、B同意连接、AB连接
断开的四次挥手:A:请求断开 B:同意断开 B:断开,A:断开
UDP
- 不建立连接,也不稳定
- 客户端,服务端:没有明确的界限
- 不管有没有准备好,都可以发给你
- DDOS 饱和攻击
以下是一次根据java的网络编程原理实现的远程聊天程序。
- 连接服务器Socket
- 发送消息
package lesson02;
//客户端
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
//客户端
public class TcpClientDemo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
System.out.println("请输入你要发送给服务端的文字:");
while(true)
{
Socket socket=null; //扩大Socket和OutpytStream 的作用域方便最后解决异常抛出情况
OutputStream os=null;
String str =sc.next();
try {//核心
//1. 要知道服务器的地址,端口号
InetAddress serverIP=InetAddress.getByName("127.0.0.1");
int port = 9921;
//2.创建一个socket连接
socket=new Socket(serverIP, port);
//3.发送消息IO流
os=socket.getOutputStream();
os.write(str.getBytes());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(os!=null) {
try {
os.close();
} catch (IOException e2) {
// TODO: handle exception
}
}
if(socket!=null)
{
try {
socket.close();
} catch (IOException e2) {
// TODO: handle exception
}
}
}
}
}
}
服务器
- 建立服务的端口ServerSocket
- 等待用户的链接 accept
- 接受用户的消息
package lesson02;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is =null;
ByteArrayOutputStream baos=null;
try {
//1.新建一个地址
serverSocket=new ServerSocket(9921);
while(true)
{
//2.等待客户端连接过来
socket=serverSocket.accept();
//3.读取客户端的消息
is =socket.getInputStream();
//把输入流通过一个管道接一下
//管道流
baos=new ByteArrayOutputStream();//输出到控制台
byte[]buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1) {//当没有结束时候将内容都写入baos
baos.write(buffer,0,len);
}
System.out.println(baos.toString()); //输出
}
} catch (IOException e) {
// TODO Auto-generated catch block
//关闭
e.printStackTrace();
}finally {
//关闭资源
if(baos!=null) {
try {
baos.close();
} catch (IOException e2) {
// TODO: handle exception
}
}
if(is!=null)
{
try {
is.close();
} catch (IOException e2) {
// TODO: handle exception
}
}
if(socket!=null)
{
try {
socket.close();
} catch (IOException e2) {
// TODO: handle exception
}
}
if(serverSocket!=null)
{
try {
serverSocket.close();
} catch (IOException e2) {
// TODO: handle exception
}
}
}
}
}
注:1.eclipse如何开多个控制台运行?
可以看这个博客:
2.遇到bind:address already in use
怎么办?
解决方法:可以看这个博客



