题外话:其实原本感觉网络编程和IO流结合,有些小迷糊.但是再在硬着头皮装B给别人答疑时,自己把自己给捋顺了...所以,装B也是一种高效学习法...
1.网络编程概述
1.1.概念:
通过编程语言实现计算机键的数据通信。
1.2.网络编程的三要素:
A:Ip地址:
是计算机的唯一标识点分十进制。IP地址的分类。IP地址的组成。ipconfig ping
B:端口
物理端口:网线插口,亲...
逻辑端口:用于标识进程的逻辑地址,不同进程的标识;有效端口:0~65535,其中0~1024系统使用或保留端口.
范围:0-65535(0-1024之间一般系统被占用.)C:协议:是定义的通信规则
UDP(面向无连接):将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快.
TCP(面向连接): 建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低注:关于InetAddress类的使用:(最需要记的就下面这个代码:)
import java.net.*;
class IPDemo{
publicstatic void main(String[] args) throws UnknownHostException{
//通过名称(ip字符串or主机名)来获取一个ip对象。
InetAddressip = InetAddress.getByName("www.baidu.com");//java.net.UnknownHostException
System.out.println("addr:"+ip.getHostAddress());
System.out.println("name:"+ip.getHostName());
}
}
2.UDP协议传输
2.1.DatagramSocket和DatagramPacket:
只要是网络传输,必须有socket .数据一定要封装到数据包中,数据包中包括目的地址,端口,数据等信息.
DatagramSocket:
直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。
直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。
DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。
DatagramPacket:
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。
2.2.代码体现,学习过程:
发送端:
import java.net.*;
import java.io.*;
/*
操作步骤:
1. 创建udp socket ,建立端点.(指定监视的端点)
2. 定义数据包(字节数组),并通过receive方法接收数据包.
3.通过数据包的方法,获取其中的数据.
4.将信息反馈给控制台.
5.读到结束符,886则读取结束.关闭资源.
*/
//创建接收端类
class ReceiveDemo{
public static void main(String[] args) throws IOException{
//创建发送端Socket服务对象,这里指定了端口,要监视特定端口传递来的数据
DatagramSocket ds = new DatagramSocket(19999);
//定义用于接收数据包的字节数组
byte[] rec = new byte[1024];
DatagramPacket dp = new DatagramPacket(rec,rec.length);//创建数据包.
while(true){
ds.receive(dp);
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
byte[] rec2 = dp.getData();
int length = dp.getLength();
String s = new String(rec2,0,length);//这里之所以要强调数据的长度,是因为传递是一个完整的1024字节的包.没有信息的用空格补齐了.
if(s.equals("886")){
break;
}
System.out.println(address +"---"+ ip +"---"+ s);
}
ds.close();
}
}
接收端:
import java.net.*;
import java.io.*;
/*
步骤:
1.创建udp服务,通过DatagramSocket对象.
2.确定数据源,并进行封装,封装成数据包.
3.通过socket服务,将已有的数据包发送出去,通过send方法.
4.关闭已经打开的资源.
*/
//创建接收端类:
class SendDemo{
public static void main(String[] args){
try
{
DatagramSocket ds = new DatagramSocket();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=br.readLine())!=null&&!line.equals("over")){
byte[] arr = line.getBytes();
DatagramPacket dp = new DatagramPacket(arr,arr.length,InetAddress.getByName("192.168.3.255"),19999);
ds.send(dp);
}
ds.close();
}
catch (Exception e)
{
}
}
}
3.TCP传输
3.1.概述:
两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。
tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket
tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket
3.2.代码体现,学习过程
服务器端:
/*
需求:
练习使用TCP传输方法传输数据
TCP服务器步骤:
1.创建服务器端的Socket对象.
2.设置一个监听,用来监听连接.(保证客户端可以进行连接)
3.Socket流中获取输入流,输出流,进行数据传输.
4.释放资源.
TCP客户端步骤:
1.创建客户端的Socket对象.
2.建立与服务器连接,
3.从Socket流中获取输入输出流,进行数据传输.
4.释放资源.
*/
import java.io.*;
import java.net.*;
//建立TCP服务器端
class TCPServer{
public static void main(String[] args)throws Exception{
//建立服务器端的socket服务.
ServerSocket ss = new ServerSocket(19999);
//此时为阻塞状态,等待获取客户端的连接.
Socket s = ss.accept();
//只有上一步得到了该客户端的连接对象才能进下一步.
InetAddress address = s.getInetAddress();
String ip = address.getHostAddress();
System.out.println(address+"---"+ip+"连接中---");
//通过从Socket流中获取输入输出流,可以进行数据传输.
//读取流中的客户端的socket对象的输入输出流.
BufferedInputStream br = new BufferedInputStream(s.getInputStream());
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("abcCopy.jpg"));
BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//拿到输入输出流进行数据操作.
byte[] arr = new byte[1024];
int len = 0;
while((len=br.read(arr))!=-1){
bw.write(arr,0,len);
bw.flush();
}
bw.close();
//发送反馈信息
bw2.write("数据成功接收");
bw2.newLine();
bw2.flush();
//br.close();
//s.close();
}
}
客户端:
/*
需求:
练习TCP客户端的搭建使用
*/
import java.io.*;
import java.net.*;
//搭建TCP数据传输的客户端
class TCPClient{
public static void main(String[] args)throws Exception{
//建立客户端的Socket对象.
Socket s = new Socket("127.0.0.1",19999);
//为Socket套接字中投入一个输入流(要不然不是一个源都没有,他怎么形成流?可以是键盘输入,可以是读取问文件等等)
BufferedInputStream br = new BufferedInputStream(new FileInputStream("abc.gif"));
//获得该Socket套接字的输入输出流(两边的互通交流in对应out,out对应in)
BufferedOutputStream bw = new BufferedOutputStream(s.getOutputStream());
BufferedReader brServer = new BufferedReader(new InputStreamReader( s.getInputStream()));
获得流对象,进行数据操作.
//int ch = 0;
//while((ch=bis.read())!=-1){
//bos.write(ch);
//}
byte[] arr = new byte[1024];
int len = 0;
while((len=br.read(arr))!=-1){
bw.write(arr,0,len);
bw.flush();
}
br.close();
s.shutdownOutput();
//获得服务器的反馈信息.
String server = brServer.readLine();//阻塞
System.out.println("server:" + server);
s.close();
}
}
4.关于套接字
一直以为套接字,套接流就是一种管道流.
后来才发现两个是两码事.但我还是觉得,套接字的表现形式很像管道流:
Socket服务器的连接动作,就像是封装了管道流的in,out对接的两个动作.
Socket中的getINput(Output)就像是管道流中的Input(Output).
彼端的in,对应此端的out;此端的in,对应笔端的out...
相当的神似...可能就是一种互通思想的多态表现形式吧......
详情请查看:http://edu.csdn.net/