—————————— ASP.Net+Android+IOS开发、.Net培训、期待与您交流!——————————
网络编程
1.找到对方的ip
2.数据要发送到指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序
都用数字标识,为了方便称呼这个标识,叫做端口逻辑端口 0-65535
3.定义通信规则,这个通讯规则称为协议,国际组定义了通用协议TCP/IP(广/局域网)
本机回环IP:127.0.0.1 Localhost
IP分为:IPv4 IPv6
网络模型:
OSI参考模型 TCP/IP参考模型
1.应用层 1.应用层
2.表示层 2.传输层
3.会话层 3.网际层
4.传输层 4.主机至网络层
5.网络层
6.数据链路层
7.物理层
例如输出过程:qq
数据封包一层层的封,再数据拆包一层层的拆
java.net包中提供了网络编程对象
InetAddress类
getLocalHost();//返回本类对象
有可能发生unknowHostException, 未知主机异常
toString();//返回主机名和主机地址字符串变现形式
getHostAddress();//获取主机地址
getHostName();//获取主机名称
//获取任意一台主机的对象
getByName(); //获取单个
getAllByName();//获取全部 返回数组
UDP传输协议
将数据及源和目的封装到数据包中,不需要建立连接
1.每个数据包的大小限制在64k内
2.因无连接,是不可靠协议
3.不需要建立连接,速度快
4.聊天,视频会议等可以使用UDP协议
TCP传输协议
1.建立连接,形成传输数据的通道
2.在连接中可以进行大数据量传输
3.通过三次握手完成连接,是可靠的协议
4.必须建立连接,效率会稍低
5.下载等可以使用TCP协议
Socket编程(网络编程)
Socket就是为网络服务提供的一种机制,通信两端都有Socket,网络通信其实就是
Socket间的通信,数据在两个Socket间通过IO流传输
UDP传输
DatagramSocket: 发送接收数据
DatagramPacket: 数据包
receive();//接收数据
send();//发送数据
/*
通过UDP传输方式,将一段话发送出去
发送端:
思路:
1.建立UDPSocket服务
2.提供数据并将数据封装到数据包中
3.通过Socket服务发送功能,将数据包发出去
4.关闭资源
*/
/*
通过UDP传输方式,用于接收并处理数据
接收端:
思路:
1.先建立UDPSocket服务,指定接收端口
2.定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中更多的功能,
可以提取字节数组的不同数据信息
3.通过Socket服务的receive方法将接收到的数据存入到定义好的数据包中
4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5.关闭资源
*/
getPort(); //获取端口
getData(); //获取数据
getAddress(); //获取发送端的IP地址
getLength();//获取数据长度
Tcp传输
Socket 客户端
ServerSocket 服务端
客户端通过查阅Socket对象,发现在该对象建立时,就可以去连接指定主机
,因为tcp是面向连接的,所以在建立Socket服务时,就要有服务端. 连接成功后
形成通路后,在该通道进行数据的传输
步骤
1.创建Socket服务,并指定要连接的主机地址和端口
2.通过io进行数据的读取和输出
3.关闭客户端
服务端:
1.建立服务的Socket服务,ServerSocket,并监听一个端口
2.获取连接过来的Socket客户端对象,通过serverSocket对象的accept方法
3.客户端如果发送来数据,那么服务端使用对应的客户端对象,并获取到该对象
的读取流来获取发过来的数据,并打印在控制台上
4.关闭服务端(可选)
该例子出现的问题: 通过键盘录入出现的
现象:客户端和服务端两端都在等待,为什么呢?
因为客户端和服务端都有阻塞式方式,这写方法没有读到结束标记
那么就一直在等待,而导致两端都在等待
网络编程
1.找到对方的ip
2.数据要发送到指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序
都用数字标识,为了方便称呼这个标识,叫做端口逻辑端口 0-65535
3.定义通信规则,这个通讯规则称为协议,国际组定义了通用协议TCP/IP(广/局域网)
本机回环IP:127.0.0.1 Localhost
IP分为:IPv4 IPv6
网络模型:
OSI参考模型 TCP/IP参考模型
1.应用层 1.应用层
2.表示层 2.传输层
3.会话层 3.网际层
4.传输层 4.主机至网络层
5.网络层
6.数据链路层
7.物理层
例如输出过程:qq
数据封包一层层的封,再数据拆包一层层的拆
java.net包中提供了网络编程对象
InetAddress类
getLocalHost();//返回本类对象
有可能发生unknowHostException, 未知主机异常
toString();//返回主机名和主机地址字符串变现形式
getHostAddress();//获取主机地址
getHostName();//获取主机名称
//获取任意一台主机的对象
getByName(); //获取单个
getAllByName();//获取全部 返回数组
/*
InetAddress
常用方法演示
*/
import java.net.*;
class Demo
{
public static void main(String[] args)throws Exception
{
//static InetAddress getLocalHost()
// 返回本地主机。
InetAddress id=InetAddress.getLocalHost();
sop(id.toString());
sop(id.getHostAddress()); //获取主机地址
sop(id.getHostName()); //获取主机名称
//通过指定地址获取主机
InetAddress local=InetAddress.getByName("192.168.100.3");
sop(local.getHostName());
//指定地址获取多个主机
InetAddress [] in=InetAddress.getAllByName("www.baidu.com");
sop(in.length);
}
public static void sop(Object o){
System.out.println(o);
}
}
UDP传输协议
将数据及源和目的封装到数据包中,不需要建立连接
1.每个数据包的大小限制在64k内
2.因无连接,是不可靠协议
3.不需要建立连接,速度快
4.聊天,视频会议等可以使用UDP协议
TCP传输协议
1.建立连接,形成传输数据的通道
2.在连接中可以进行大数据量传输
3.通过三次握手完成连接,是可靠的协议
4.必须建立连接,效率会稍低
5.下载等可以使用TCP协议
Socket编程(网络编程)
Socket就是为网络服务提供的一种机制,通信两端都有Socket,网络通信其实就是
Socket间的通信,数据在两个Socket间通过IO流传输
UDP传输
DatagramSocket: 发送接收数据
DatagramPacket: 数据包
receive();//接收数据
send();//发送数据
/*
通过UDP传输方式,将一段话发送出去
发送端:
思路:
1.建立UDPSocket服务
2.提供数据并将数据封装到数据包中
3.通过Socket服务发送功能,将数据包发出去
4.关闭资源
*/
/*
通过UDP传输方式,用于接收并处理数据
接收端:
思路:
1.先建立UDPSocket服务,指定接收端口
2.定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中更多的功能,
可以提取字节数组的不同数据信息
3.通过Socket服务的receive方法将接收到的数据存入到定义好的数据包中
4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5.关闭资源
*/
getPort(); //获取端口
getData(); //获取数据
getAddress(); //获取发送端的IP地址
getLength();//获取数据长度
/*
udp 发送端
*/
import java.net.*;
class UdpSend
{
public static void main(String[] args)throws Exception
{
DatagramSocket ds=new DatagramSocket(8888);
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
String str="udp测试";
byte []buf=str.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.100.3"),1314);
ds.send(dp);
ds.close();
}
}
/*
接收端
*/
import java.net.*;
class UdpRece
{
public static void main(String[] args)throws Exception
{
//DatagramSocket(int port)
// 创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket ds=new DatagramSocket(1314);
//DatagramPacket(byte[] buf, int length)
// 构造 DatagramPacket,用来接收长度为 length 的数据包。
byte buf[]=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
InetAddress in=dp.getAddress();
sop(new String(dp.getData(),0,dp.getLength()));
sop(in.getHostAddress());
sop(in.getHostName());
sop(dp.getLength());
sop(dp.getPort());
ds.close();
}
public static void sop(Object o){
System.out.println(o);
}
}
/*
键盘录入 发送数据
*/
import java.net.*;
import java.io.*;
class Send
{
public static void main(String[] args)throws Exception
{
DatagramSocket ds=new DatagramSocket(8888);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
byte []buf=null;
while((line=br.readLine())!=null){
if("over".equals(line))
break;
buf=line.getBytes("utf-8");
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.100.3"),1314);
ds.send(dp);
}
br.close();
ds.close();
}
}
/*
接收端
不断接收客户的数据
*/
import java.net.*;
class Rece
{
public static void main(String[] args)throws Exception
{
DatagramSocket ds=new DatagramSocket(1314);
byte []buf=new byte[1024];
while(true){
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
System.out.println(new String(dp.getData(),0,dp.getLength(),"utf-8"));
}
}
}
Tcp传输
Socket 客户端
ServerSocket 服务端
客户端通过查阅Socket对象,发现在该对象建立时,就可以去连接指定主机
,因为tcp是面向连接的,所以在建立Socket服务时,就要有服务端. 连接成功后
形成通路后,在该通道进行数据的传输
步骤
1.创建Socket服务,并指定要连接的主机地址和端口
2.通过io进行数据的读取和输出
3.关闭客户端
服务端:
1.建立服务的Socket服务,ServerSocket,并监听一个端口
2.获取连接过来的Socket客户端对象,通过serverSocket对象的accept方法
3.客户端如果发送来数据,那么服务端使用对应的客户端对象,并获取到该对象
的读取流来获取发过来的数据,并打印在控制台上
4.关闭服务端(可选)
该例子出现的问题: 通过键盘录入出现的
现象:客户端和服务端两端都在等待,为什么呢?
因为客户端和服务端都有阻塞式方式,这写方法没有读到结束标记
那么就一直在等待,而导致两端都在等待
/*
文件转换器
客户端
*/
import java.io.*;
import java.net.*;
class Client
{
public static void main(String[] args)throws Exception
{
// Socket(InetAddress address, int port)
// 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket s=new Socket("192.168.100.3",1314);
// OutputStream getOutputStream()
// 返回此套接字的输出流。
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
// InputStream getInputStream()
// 返回此套接字的输入流。
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
pw.println(line);
System.out.println(brin.readLine());
}
br.close();
s.close();
}
}
/*
文字转换器
服务端
*/
import java.io.*;
import java.net.*;
class Server
{
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(1314);
while(true){
Socket s=ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=br.readLine())!=null){
pw.println(line.toUpperCase());
}
}
}
}
/*
TCP复制文本文件
*/
import java.io.*;
import java.net.*;
class PicClient
{
public static void main(String[] args)throws Exception
{
Socket s=new Socket("192.168.100.3",1314);
BufferedReader br=new BufferedReader(new FileReader("test.txt"));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
s.shutdownOutput();
System.out.println(brin.readLine());
br.close();
s.close();
}
}
class PicServer
{
public static void main(String []args)throws Exception{
ServerSocket ss=new ServerSocket(1314);
Socket s=ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw=new BufferedWriter(new FileWriter("server.txt"));
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
s.close();
ss.close();
}
}
—————————— ASP.Net+Android+IOS开发、.Net培训、期待与您交流!——————————