0828总结
网络编程
计算机网络:是不同地区,通过网络来传递数据,来进行数据的交互
网络编程的三大要素:1.ip;2.端口号;3.协议
ip
ip 是每一台电脑的唯一标识
ip4
由0-255组成,有四个字节,一般网络都是 192.168(c类网络)
一般政府、军事用途(a类网络)
一般子网:10.08;本地的特殊ip是127.0.0.1(this)
查看当前电脑的ip地址:cmd里面输入ipconfig
拼服务器是否连通:拼ip地址(重点)
ip6
由8个数组组成,四个16进制组成
InetAddress类
Java提供的获取ip的类
返回本地主机:InetAddress getLocalHost()
获取ip地址:String getHostAddress()
获取ip的主机名:String getHostName()
端口号
每一个软件(每一个进程)的唯一标识
当软件开启之后,系统给其生成的一个,也可以自己去设置;当软件开启是端口号系统产生,当软件关闭的时候,回收
常见的端口号
Tomcat:8080
oracle:1521
mysql:3306
qq:4000
邮箱的端口号: 网易 137
协议
各个计算机网络传输的一个规范:协议分为7层
主要的是传输层:TCP、UDP、xmpp 协议–>即时通讯(qq,微信)
web阶段:http 协议、https 协议
UDP 面向无连接的协议:传输的数据快,但是可以会丢数据(cts、飞秋)、会出现卡顿
TCP 面向连接的协议:传输慢,不会丢失数据(三次握手)【qq传消息,文字需要准确性,使用的就是这个协议】
http 与 https 都是属于一次性的连接;也就是客户端给服务器发送请求,当交互完,这个请求就断开了
https:http+ssl 证书,这个证书保证数据的传输的安全性,大部分上线的网站都会使用https协议
TCP协议
Socket 对象:接字是两台机器间通信的端点
构造方法
public Socket(String host,int port)
传递两个参数:一个ip地址,一个是端口号
如果是本机ip地址传递 localhost
常规的方法
写数据的流对象:getOutputStream()
读取数据的对象:getInputStream()
刷新:shutdownOutput() 【类似于flush()方法】
客户端:发送消息的过程
1、实例化这个socket对象
2、通过socket对象得到输出流 OutputStream
3、调用 write()
4、shutdownOutput()
public class Kehu {
public static void main(String[] args) {
Socket socket= null;
try {
socket = new Socket("localhost",8989);
OutputStream os=socket.getOutputStream();
InputStream is=socket.getInputStream();
os.write("你好吗".getBytes());
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器:接收信息的过程
1、实例化ServerSocke
2、调用 accept() ;返回的是一个socket对象
3、拿到输入流 InputStream
4、new BufferReader(new InputStreamReader(new FileInputStream))
public class Service {
public static void main(String[] args) {
ServerSocket serverSocket= null;
try {
serverSocket = new ServerSocket(8989);
Socket socket=serverSocket.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str=null;
while ((str=br.readLine())!=null){
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:要先运行服务器,再运行客户端
如果有两个客户端,一个服务器,就会产生一个错误:Connection refused: connect
解决多个客户端对应一个服务器的问题:用多线程解决
线程类里:
/*相当于把serverSocket = new ServerSocket(8989);
和Socket socket=serverSocket.accept();移出run方法里面,再构造一个socket*/
public class MyThread extends Thread{
private Socket socket;
public MyThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str=null;
while ((str=br.readLine())!=null){
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务类
public class Ser {
public static void main(String[] args) {
try {
ServerSocket serverSocket=new ServerSocket(8889);
Socket socket=null;
while (true){
socket=serverSocket.accept();
MyThread myThread=new MyThread(socket);
myThread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用socket实现文件上传的功能:
客户端:
1、读取出需要上传的图片
2、通过socket拿到的输出流写入到服务器
服务器:
1、通过socket拿到输入流把图片读取出来(1、创建文件夹保存图片;2、注意避免图片被覆盖)
2、保存在本地
UDP协议
基于UDP协议进行传输的过程,类似于发包裹
1、传输的类主要是:DatagramSocket(此类表示用来发送和接收数据报包的套接字)
构造方法
public DatagramSocket(int port,InetAddress laddr)
第一个参数端口号、第二个参数是地址
public DatagramSocket(int port)
参数是端口号
常规方法
发送数据包:send(DatagramPacket p)
接收数据包:receive(DatagramPacket p)
2、数据包类:DatagramPacket(包裹对象)
构造方法
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
传递的参数依次是:字节数组;从字节数组的什么地方开始;到哪里结束;获取的ip对象;端口号
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
方法
返回SocketAddress:SocketAddress getSocketAddress()
获取缓冲区的数据:byte[] getData()
客户端的步骤:(基于UDP的客户端)
1、实例化这个对象
2、构建一个数据包
3、发送数据
4、关闭资源
public class Ke {
public static void main(String[] args) {
try {
DatagramSocket ds=new DatagramSocket();
String str="长江长江,我是黄河";
InetAddress inetAddress=InetAddress.getByName("localhost");
DatagramPacket dp=new DatagramPacket(str.getBytes(),0,str.getBytes().length,inetAddress,8887);
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器的步骤:(基于UDP的服务器)
1、实例化这个对象DatagramSocket
2、构建一个包裹对象
3、接收数据 receive()
4、关闭资源
public class Ser {
public static void main(String[] args) {
try {
DatagramSocket ds=new DatagramSocket(8887);
byte[] b=new byte[1024];
DatagramPacket dp=new DatagramPacket(b,b.length);
ds.receive(dp);
byte[] by=dp.getData();
System.out.println(new String(by,0,by.length));
} catch (IOException e) {
e.printStackTrace();
}
}
}