网络编程
OSI
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP 应用层(数据段)、传输层(数据包)、网络互连层(数据帧)、主机到网络层(比特)
传输协议:通讯规则
UDP
1将数据及源和目的封装在数据包中,不需要建立连接(面向无连接)
2每个数据报的大小限制在64k
3因无连接,是不可靠协议
4不需要建立连接,速度快
TCP
1建立连接,形成传输数据通道
2在建立连接中进行大数据量传输
3通过三次握手完成连接,是可靠协议
4必须建立连接效率会低
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
* 定义udp协议数据传输的接收端
*/
/*
* 1,定义udpsocket服务
* 2,定义一个数据包,因为要存储接收到的字节数
* 3,通过socket服务receive方法将接收到的数据存入已定义好的数据包上
* 4,通过数据包对象的特有功能,取出数据
* 5,关闭资源
*/
public class UdpReceive {
publicstatic void main(String[] args) throws IOException {
//1,创建udp socket,建立端点
DatagramSocketds = new DatagramSocket(10000);
//2,定义数据包,用于存储数据
byte[]buf = new byte[1024];
DatagramPacketdp = new DatagramPacket(buf, buf.length);
//3,通过socket服务receive方法将接收到的数据存入已定义好的数据包上
ds.receive(dp);
//4,通过数据包对象的特有功能,取出数据
Stringip = dp.getAddress().getHostAddress();
Stringdata = new String(dp.getData(),0,dp.getLength());
intport = dp.getPort();
System.out.println("ip:"+ ip +"port:" + port +"data:" + data );
// 5,关闭资源
ds.close();
}
}
/*
* 定义udp协议数据传输的发送端
*/
publicclass UdpSend {
publicstaticvoid main(String[] args) throws IOException {
// TODO Auto-generatedmethod stub
//1,创建udp服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2,确定数据
byte[] buf = "udp sendclient".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length, InetAddress.getByName("127.0.0.1"),10000);
//3,通过socket服务,将已有的数据包发送出去,通过send()方法;
ds.send(dp);
//4,关闭资源
ds.close();
}
}
class TcpClient2{
publicstaticvoid main(String[] args) throws IOException{
//建立socket服务。指定要连接主机和端口
Socket s = new Socket("127.0.0.1",10004);
//获取socket流中的输出流
OutputStream out = s.getOutputStream();
//将数据写到该流中
out.write("服务端,你好".getBytes());
//获取socket输入流
InputStream in = s.getInputStream();
byte[] buf = newbyte[1024];
//将服务端反馈的信息获取到
int len = in.read(buf);
//打印
System.out.println(s.getInetAddress() + ":" + new String(buf,0,len));
//关闭资源
s.close();
}
}
class TcpServer2{
publicstaticvoid main(String[] args) throws IOException{
//建立服务端的Socket服务并监听端口
ServerSocket ss = new ServerSocket(10004);
//通过ServerSocket的accept方法获取连接过来的客户端对象
Socket s = ss.accept();
//获取socket输入流
InputStream in = s.getInputStream();
byte[] buf = newbyte[1024];
//读取输入流信息
int len = in.read(buf);
//输出信息
System.out.println(s.getInetAddress() + ":" + new String(buf,0,len));
//读取输出流
OutputStream out = s.getOutputStream();
//想输出流中写入数据
out.write("哥们你也好".getBytes());
//关闭资源
s.close();
}
}
反射,反射就是把java类中的各种成分映射成相应的java类。
获取字节码
String string = "abc";
Class cls1 = string.getClass();
Class cls2 = String.class;
Classcls3 = Class.forName("java.lang.String");
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 属性。
privatestaticvoidsetProperty(Object obj, String propertyName,
Objectvalue) throwsIntrospectionException,
IllegalAccessException,InvocationTargetException {//根据对象和属性名,设置对象的属性值
PropertyDescriptorpd = newPropertyDescriptor(propertyName,obj.getClass());//获取属性描述
MethodmethodSetX = pd.getWriteMethod();//抽取方法
methodSetX.invoke(obj,value);//调用方法设置
}
privatestaticObject getProperty(Object obj,
StringpropertyName) throwsIntrospectionException,
IllegalAccessException,InvocationTargetException {//根据对象和属性名,获取对象的属性值
// PropertyDescriptorpd = new PropertyDescriptor(propertyName,obj.getClass());//获取属性描述
// MethodmethodGetX = pd.getReadMethod();//抽取方法
// ObjectretVal= methodGetX.invoke(obj);//调用方法取值
BeanInfobeanInfo = Introspector.getBeanInfo(obj.getClass());//获取BeanInfo
PropertyDescriptor[]pds =beanInfo.getPropertyDescriptors();//获取所有的属性描述
ObjectretVal = null;
for(PropertyDescriptorpd:pds){//遍历属性描述
if(pd.getName().equals(propertyName)){//如果找到需要的属性名
MethodmethodGetX = pd.getReadMethod();//获取方法
retVal= methodGetX.invoke(obj);//调用方法取值
break;
}
}
returnretVal;
}
Java5新特性
1,静态导入
2,增强for循环
3,基本数据类型的自动拆箱与装箱
4,枚举
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。如果枚举只有一个成员时,就可以作为一种单例的实现。
5,注解
相当于一种标记,在程序中加了注解就等于为程序打上了某种标记。可以用反射来了解类的各种元素上有无标记,加的是何种标记。可以加在包、类、方法、变量等
注解类似接口@interface
属性类似方法 String color();
6,泛型
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉类型的信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass方法返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器就可以往某个泛型集合中加入其他类型的数据,例如用泛型得到集合,再调用其add方法即可
//通过方法获取泛型类型
publicclass GenericTest {
publicstaticvoid main(String[] args) throws SecurityException,NoSuchMethodException{
ArrayList<String> list = new ArrayList<String>();
Method applyMethod = GenericTest.class.getDeclaredMethod("applyMethod", list.getClass());
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pType = (ParameterizedType) types[0];
System.out.println(pType.getRawType());
System.out.println(pType.getActualTypeArguments()[0]);
}
publicstaticvoid applyMethod(ArrayList<String> list){
}
}
---------------------- android培训、java培训、期待与您交流!
----------------------详细请查看:http://edu.csdn.net/heima