java网络编程笔记

网络编程就是在两个或两个以上的设备之间传输数据

网络通讯两种方式:

1、TCP(传输控制协议)
使用这种方式进行网络通讯,需要建立专门的虚拟连接,然后
进行可靠的数据传输,如果数据发送失败,则客户端会自动
重发
2、UDP(用户数据报协议)
不需要建立专门的虚拟连接,传输也不是可靠。如果发送失败则客户端无法获得

TCP与UDP的区别
重要的数据一般用TCP方式进行数据传输
大量非核心的数据则通过UDP方式进行传递
由于TCP要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP的速度稍慢。而且传输时产生的数据量要比UDP稍微大
使用UDP,每个数据报都给出完整的地址信息,因此无需要建立发送方和接收方的连接
对于TCP,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然建立连接,在TCP中多了一个连接建立的时间
使用UDP传输数据时有大小限制,每个被传输的数据报须限定在64kb内
TCP没有大小限制,一旦连接建立 ,双方的socket就可以按统一的格式传输大量的数据
UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方
TCP是一个可靠协议,它确保接收方完全正确地获取发送方所发送的全部数据
TCP在网络通信上有极强的生命 力。相比于UDP操作简单,仅需要较少的监护



基于URL的网络编程
1创建一个URL 类URL
类URL提供的方法
getProtocol()//获取该URL的协议名
getHost()//获取该URL的主机名
getPort()//获取该URL的端口号
getFile()//获取该URL的文件名
getRef()//获取该URL在文件中的相对位置
getQuery()//获取该URL的查询信息
getPath()//获取该URL的路径
getAuthority()//获取该URL的权限信息
getUserInfo()//获得使用者信息

方法openStream()与指定的URL建立连接并返回InputStream类的对象
以从这一连接中读取数据
public static void main(String[] args) throws IOException  {
	URL url=new URL("http://www.baidu.com");
	//使用openStream得到一输入流并由此构造一个BufferedReader对象
	BufferedReader br=new BufferedReader(new InputStreamReader(
			url.openStream()));
	String line=null;
	while((line=br.readLine())!=null){
		System.out.println(line);
	}
	br.close();
}




网络编程都是由客户端和服务端组成
1、客户端网络编程
首先建立网络连接。需要指定连接到的服务器的IP地址和端口号,建立完成会形成
一条虚拟的连接。
再次交换数据。按照请求响应模型进行,由客户端发送一个请求数据到服务器,
服务器反馈一个响应数据给客户端。如果客户端不发送请求则服务器就不响应
然后关闭网络连接。释放程序占用的端口,内存等系统资源


2、服务器端网络编程
服务器端是指在网络编程中被动等待连接的程序。
首先,监听端口。监听本地计算机的某个固定端口,这个端口是服务器端开放给客户端的端口
服务器端程序运行的本地计算机的IP地址就是服务器端程序 的IP地址
再次,获得连接 当客户端连接到服务器端时,服务器端就可以获得一个连接
这个连接包含客户端的信息,如客户端IP地址等。可通过这个连接进行数据交换
一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接
都由独立的线程实现 
然后,交换数据 服务器端的数据交换步骤是首先接收客户端发送过来 的数据,然后进行
逻辑处理,再把处理的结果数据发送给客户端。先接收再发送
最后 ,关闭连接


一个基础的网络类InetAddress
该类的功能 代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类内部
	public static void main(String[] args) throws IOException  {
		InetAddress inet=InetAddress.getByName("www.163.com");
		System.out.println(inet);//www.163.com/220.162.97.165
	}
//使用IP地址创建对象	
InetAddress inet=InetAddress.getByName("220.162.97.165");
//获取本机地址对象
public static void main(String[] args) throws IOException  {
	InetAddress inet=InetAddress.getLocalHost();
	System.out.println(inet);//out:cx-st57/10.8.29.157
}


public static void main(String[] args) throws IOException  {
	InetAddress inet=InetAddress.getLocalHost();
	String host=inet.getHostName();//获得对象存储的域名
	String ip=inet.getHostAddress();//获得对象存储的IP
	System.out.println(host);//out:cx-st57
	System.out.println(ip);//out:10.8.29.157
}






TCP编程
java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接
客户端
首先,建立socket连接 Socket s=new Socket("www.sohu.com",80);
再次,按照请求响应模型进行网络数据交换
数据传输功能 由java IO实现 ,只需要 从连接中获得输入流和输出流,然后将需要 发送
的数据写入连接对象的输出流
OutputStream o=s.getOutputStream()
InputStream i=s.getInputStream()
最后,关闭网络连接
s.close()


服务器端
首先,监听端口
ServerSocket s=new ServerSocket(10000);
再次,获得连接
Socket socket=s.accept();实现 的功能是获得当前连接到服务器端的客户
端的连接。
accept和IO中的read方法是一个阻塞方法。就是当无连接时,该 方法会阻塞程序的执行,
直到连接到达时才执行该行代码。
然后,数据交换
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream()
最后,关闭服务器端连接socket.close()
public class Test {


	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException  {
		ServerSocket ss=null;
		Socket socket=null;
		OutputStream os=null;
		InputStream is=null;
		int port=10000;
		try{
			//监听端口
			ss=new ServerSocket(port);
			//获得连接
			socket=ss.accept();
			//接收客户端发送内容
			is=socket.getInputStream();
			byte[] b=new byte[1024];
			int n=is.read(b);
			//输出
			System.out.println("client content:"+new String(b,0,n));
			//向客户端发送反馈内容
			os=socket.getOutputStream();
			os.write(b,0,n);
			
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			os.close();
			is.close();
			socket.close();
			ss.close();
		}
	}
}





UDP编程
主要类:
1DatagramSocket类。实现发送数据时的发射器以及接收数据时的监听器
2DatagramPacket类。实现对于网络中传输的数据封装。


建立连接
DatagramSocket ds=new DatagramSocket();
该客户端连接使用系统随机分配 的一个本地计算机的未用端口号
或者
DatagramSocket ds=new DatagramSocket(5000);


发送数据
在发送数据时,需要 将需要发送的数据内容首先转换成byte数组,然后
装数据内容,服务器IP和服务器端口号一起构造 成一个DatagramPacket
类型的对象。发送时调用网络连接对象 的send方法发送
	public static void main(String[] args) throws UnknownHostException, IOException {
		String s="hello world";
		String host="127.0.0.1";
		DatagramSocket ds=new DatagramSocket();
		int port=10000;
		//将发送的内容转换成byte数组
		byte[] b=s.getBytes();
		//将服务器IP转换成I netAddress对象 
		InetAddress server=InetAddress.getLocalHost();
		//构造发送的数据包对象
		DatagramPacket sendDp=new DatagramPacket(b,b.length,server,port);
		// 发送数据
		ds.send(sendDp);
	}


UDP客户端编程接收数据
首先,构造一个数据缓冲数组,用于存储接收的服务器端反馈数据,。
然后,以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用连接对象
的receive方法接收数据即可。
byte[] data=new byte[1024];
	//构造数据包对象
	DatagramPacket receiveDp=new DatagramPacket(data, data.length);
	//接收数据
	ds.receive(receiveDp);
	//输出数据内容
	byte[] bb=receiveDp.getData();//获得缓冲数组
	int len=receiveDp.getLength();//获得有效数据长度
	String ss=new String(bb,0,len);
	System.out.println(ss);


最后,关闭连接
ds.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值